C++异常处理
首先C没有异常处理,C++有
基本上就是
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
void fun2() { // throw 2; // throw std::string("abc"); // assert(false); return ; } void fun1() { try { // A fun2(); // B: 如果在fun2()里throw // C } catch ( int &a) { // D:在这里处理整数表示的异常 } catch (std::string &s) { // E:在这里处理字符串格式表示的异常 } // F: 接下来的内容 return ; } |
整个执行过程如下
执行A处的代码
执行B处代码,即调用fun2()
如果fun2里正常return了,则执行C,然后执行F。
如果fun2里执行了throw 2;(或者int a; throw a;),那么会立刻从fun2()中跳出来,跳过C直接执行D,然后是F。
如果fun2里执行了throw std::string("abc"),那么会立刻从fun2()中跳出来,跳过C直接执行E,然后是F。
如果fun2里执行了assert(false);,那么会立刻从fun2()中跳出来,跳过C和后面一串catch,也不执行F,而是继续往上跳到更上一级函数中调用fun1的地方(比如更上一级的函数叫fun0()),再看看fun0调用fun1的地方有没有try-catch合适的异常。
即,如果一个函数中执行了throw 某个变量的代码,则会立刻从该函数中跳出,进入调用该函数的函数,如果在那儿是被try包住的,就检查try后面一排catch的类型,并进入和throw出来的变量相同类型的catch里(这就是”捕获异常“)。如果任何一个catch的类型都和throw出来的变量类型不符,则会继续往上抛。
一种特殊的catch,是catch后面不设定具体变量类型,仅仅是3个点,它会捕获任意类型异常。
1
2
3
|
catch (...) { } |
一种特殊的throw,是用于某个catch内部,直接写
1
2
3
4
5
|
catch ( int &a) { // 一些处理代码,比如cout << a << endl; throw ; } |
这时就是将该catch捕获到的异常继续往上抛的意思。