C++ 的异常处理机制允许把错误的检测和处理过程分开,比起传统的错误码,抛出一个异常对象可以携带更多上下文信息。
抛出和捕获
当遇到错误时,用 throw 抛出一个异常对象;异常会沿着调用链向上传播,直到被一个类型匹配的 catch 子句捕获。一旦抛出异常,编译器会生成一个临时对象的拷贝(因为原对象可能即将销毁),这个拷贝在 catch 结束后销毁。
查找匹配的 catch 的过程就是栈展开:从当前函数开始,如果当前 try 块内部抛出,先看同层 catch;不匹配则退出当前函数,继续在上层调用者中查找。如果一直回溯到 main 都没被捕获,程序会调用 std::terminate 终止。
下面这段代码展示了栈展开的典型行为:
double divide(int a, int b) {
try {
if (b == 0) {
string s("divide by zero condition");
throw s;
} else {
return (double)a / (double)b;
}
} catch (int errid1) {
cout << errid1 << endl;
}
}
void func() {
int a, b;
cin >> a >> b;
try {
divide(a, b);
} catch (const char* errid2) {
cout << errid2 << endl;
}
cout << "没匹配到依然会打印吗?" << endl;
}
int main() {
try {
func();
} catch (string& s) {
cout << s << endl;
}
return ;
}


