问题标题: C++异常

1
1
已解决
薛乘志
薛乘志
初级启示者
初级启示者

众所周知,c/c++中处理错误的传统方法为返回错误码,如

int foo() { ... } // 返回0为成功,否则失败

这种方法很好用,但是如果这个函数原本有一个返回值就只能引用传参了,如

int foo(int &x) { x=... } // 返回0为成功,否则失败

参数一多,就显得十分丑陋

而且如果在一个函数中,要调用多个可能失败的函数,那写法就更啰嗦了:

void foo() {
    if (doSomething1() != 0) { (错误处理),return; }
    if (doSomething2() != 0) { (错误处理),return; }
    if (doSomething3() != 0) { (错误处理),return; }
} 

于是有人想了新办法,出现错误时,统一跳转到函数末尾来进行错误处理:

void foo() {
    if (doSomething1() != 0) { goto error; }
    if (doSomething2() != 0) { goto error; }
    if (doSomething3() != 0) { goto error; }
    return;
error:
    (错误处理)
}

但是每次的错误不一定相同,这处理起来就很麻烦

而且有一种更麻烦的情况,即该函数不能自己处理错误,要将错误码传递到外层函数,那又要写一个错误码返回的代码,这写起来就很不简洁优雅

于是就出现了异常这一新的错误处理方式,完美解决了上面的问题:

void foo() {
    try {
        doSomething1();
        doSomething2();
        doSomething3();
    } catch (exception &e) {
        (错误处理)
    }
}

其结构类似do..while循环,try后面跟随一段代码,放置可能出现异常的代码段,后面紧接着一个catch()用于处理异常,exception &e则是c++标准的异常类型,当然也可以catch其他类型的异常;抛出异常使用throw xxx。

下面是一个例子:

int input() {
    int n;
    cout << "请输入一个1~100的数字:";
    cin >> n;
    if (n < 1 || n > 100) throw "输入大小超出范围!";
    return n;
}
int main() {
    try {
        int k = input();
        cout << "你输入的是" << k << endl;
    } catch (const char* str) {
        cout << str;
    }
    return 0;
}

当输入的值不在1~100范围内时,代码运行到 throw 位置后,跳转至最近的类型符合的 catch() 位置,运行处理错误的代码(输出“输入大小超出范围!”),且不会返回 throw 位置。这个过程可以跨多层函数调用,直至找到对应的 catch() 位置。所以可以说,C++的异常本质上就是一种跳转


0
0
0
薛文博
薛文博
资深光能
资深光能

_____________________________________

0
我要回答