2015-05-29 3 views
1

Я новичок в C++, так что помочь мне с этой логикой,Как эффективно использовать попытку поймать в C++

Я создал карту и вводил данные. Этот вопрос основан на обработке исключений. Если в моей попытке {...} есть ошибка. Неверный ввод типа данных, он бросает на catch() и выполняет функцию mContinueOrNot(), но программа завершается без получения значения для cContinueCharacter.

void mSearchForCustomer() 
{ 
    try 
    { 
      int ncustomerid; 
     std::cout<< "\nEnter the Customer ID to Search \t"; 
     if(!(std::cin >> ncustomerid)) 
     { 
      throw (ncustomerid); 
     } 
      /*My Code*/ 

     mContinueOrNot(); 
    } 
    catch(int) 
    { 
     std::cout<< "\nWRONG INPUT\n"; 
     mContinueOrNot(); 
    } 
} 




void mContinueOrNot() 
{ 
    char cContinueCharacter; 
    std::cout<<"\nEnter 'Y' to continue \n"; 
    std::cout<<"Continue????????? :\t"; 
    std::cin>>cContinueCharacter; 

    if(cContinueCharacter == 'y' || cContinueCharacter == 'Y') 
     mChoice(); 
    else 
     exit(0); 

} 

Заранее спасибо

+0

это пользовательский ввод .. я объявил его в классе – Amir

+8

Не совсем относится к вопросу, но то, что вы пытаетесь сделать, это «контролировать поток за исключением», что является плохим идеей. Вы должны переписать свой код, поэтому неправильный выбор не является исключительным условием (это не так). –

+1

Я не мог понять ничего из-за плохого отступа, поэтому отформатировал код. Надеюсь, я сделал все правильно, и я надеюсь, что вы действительно так выразились. – petersohn

ответ

2

Вам не нужно использовать исключение в этом случае. Гораздо проще сделать это следующим образом:

if(!(std::cin >> ncustomerid)) { 
    std::cout<< "\nWRONG INPUT\n"; 
} else { 
    std::cout << "\nSeatch Result:\n"; 
    ... 
} 
mContinueOrNot(); 

Кроме того, бросать int, как правило, плохая идея. Обычно вы должны бросать только объекты, которые производны от std::exception для обработки ошибок, или объект, который не получается из него для некоторых особых случаев (но вам, вероятно, это не понадобится).

Обычно вы предпочитаете использовать исключения для более сложной обработки ошибок. Обычно вы пытаетесь выполнить код, который может выйти из строя в нескольких точках, затем поймать ошибку и обработать ее в какой-то момент. Например, если код будет выглядеть следующим образом без исключений:

int innerFunction1() { 
    ... 
    if (somethingWentWrong()) { 
     return SOME_ERROR; 
    } 
    ... 
    return SUCCESS; 
} 

int innerFunction2() { 
    ... 
} 

... 

int outerFunction1() { 
    int errorCode; 
    if ((errorCode = innerFunction1()) != SUCCESS) { 
     return errorCode; 
    } 
    if ((errorCode = innerFunction2()) != SUCCESS) { 
     return errorCode; 
    } 
    ... 
} 

int outerFunction2() { 
    int errorCode; 
    if ((errorCode = innerFunction3()) != SUCCESS) { 
     handleErrorInInnerFunction3(errorCode); 
     return errorCode; 
    } 
    ... 
} 

... 

int main() { 
    if (outerFunction1() != SUCCESS) { 
     handleError(); 
    } 
    if (outerFunction2() != SUCCESS) { 
     handleError(); 
    } 
    ... 
} 

То же самое будет выглядеть следующим образом с исключениями:

class SomeException : public std::exception { 
    ... 
}; 

void innerFunction1() { 
    ... 
    if (somethingWentWrong()) { 
     throw SomeException(); 
    } 
    ... 
} 

int innerFunction2() { 
    ... 
} 

... 

int outerFunction1() { 
    innerFunction1(); 
    innerFunction2(); 
} 

int outerFunction2() { 
    try { 
     innerFunction3(); 
    catch (SomeException& e) { 
     handleErrorInInnerFunction3(e); 
     throw; 
    } 
    ... 
} 

... 

int main() { 
    try { 
     outerFunction1(); 
     outerFunction2(); 
    } catch (SomeException&) { 
     handleError(); 
    } 
    ... 
} 

Вы можете, вероятно, понять, почему второй пример яснее, чем первый ,

+0

Я пробовал его .. его тоже полезно .. вместо того, чтобы использовать try catch, я могу использовать это .. но все равно такая же ошибка существует .. – Amir

1

После того как вы !(std::cin >> ncustomerid)

состояние ошибки станд :: CIN установлен, необходимо сбросить его, прежде чем читать из него.

Смежные вопросы