zoukankan      html  css  js  c++  java
  • 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捕获到的异常继续往上抛的意思。

  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/johnnyflute/p/3711151.html
Copyright © 2011-2022 走看看