如何在C ++中有效地使用try catch

时间:2015-05-29 09:04:36

标签: 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);

}

先谢谢

2 个答案:

答案 0 :(得分: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();
    }
    ...
}

你可能会看到为什么第二个例子比第一个例子更清晰。

答案 1 :(得分:1)

获得!(std::cin >> ncustomerid)

设置了std :: cin的错误状态,你必须先重置它才能读取它。