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 | voidfun2(){    // throw 2;    // throw std::string("abc");    // assert(false);    return;}voidfun1(){    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捕获到的异常继续往上抛的意思。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号