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

  • 相关阅读:
    HTML CSS整理笔记
    2020软件工程最后一次作业
    form表单的基本用法
    图片预加载和懒加载(2)——懒加载
    ES6——promise基础
    图片预加载和懒加载(2)——预加载
    图片预加载和懒加载(1)
    js时间——转换为我们需要的格式
    原生js瀑布流
    富文本——小程序中使用特殊符号及标签
  • 原文地址:https://www.cnblogs.com/johnnyflute/p/3711151.html
Copyright © 2011-2022 走看看