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捕获到的异常继续往上抛的意思。

原文地址:https://www.cnblogs.com/johnnyflute/p/3711151.html