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++的异常本质上就是一种跳转。
