c++
异常是对程序运行过程中发生的异常情况的一种响应,异常提供了将控制权从程序的一个部分转移到另一个部分,异常处理由三部分组成:
throw
抛出异常catch
捕获异常try
异常检测范围主要框架如下:
try {
if (cond)
throw ...;
} catch(...) {
} catch(...) {
}...
注意:执行 throw
语句类似与执行 return
返回语句,它会终止函数的执行,但是 throw
并不是把控制权交给调用函数,而是沿函数调用序列进行回退,直到找到包含 try
块的函数并能成功匹配异常。
啥意思呢?考虑如下代码:
#include
using std::cin;
using std::cout;
using std::endl;
int add(int a, int b)
{
if (!(a + b))
throw "Note: a is allowed to equal to -b";
cout << "add end\n";
return a + b;
}
int func(int a, int b)
{
int c;
try {
c = add(a, b);
} catch (char ch) {
cout << "func catch\n";
}
cout << "func end\n";
return a * c;
}
int main()
{
int a, b, c;
cin >> a >> b;
try {
c = func(a, b);
cout << c << endl;
} catch (const char* s) {
cout << s << endl;
}
cout << "END\n";
return 0;
}
这里调用关系为:main -> func -> add
,输入 a = 1, b = -1
,最后会在 add
函数中触发异常,这时 throw
会抛出异常,这时会沿调用路径回溯寻找 try - catch
捕获异常,所以这里触发异常后,控制权就直接回到了 main
函数中,所以 cout << "func end\n";
不会执行:输出结果如下
xiaozaya@pwn:~/rubbish/cpp$ ./a.out
1 -1
Note: a is allowed to equal to -b
END
不同的操作系统,不同的编译器,异常处理的底层实现是不同的,这里主要分析下 linux gcc
下的原理实现,这里找到了几篇文章,所以就不打算写垃圾了:
c++ 异常处理(1)
c++ 异常处理(2)
CPP 异常处理机制初探
C++异常机制的实现方式和开销分析