C++异常之栈解旋

简介: C++异常之栈解旋

一般的异常处理

// 一般的异常
int func01(int _x, int _y)
{
    if (_y == 0)
        throw "除数=0";
    return _x / _y;
}
// int func(int x, int y) throw(int, char, char *); //可以抛出int,char char*类型 若抛出float则在try{}模块检测不到
// int func(int x, int y) throw();                  //不会抛出异常
// int func(int x, int y)                           //可以抛出任意类型的异常
void text01()
{
    int x = 100;
    try
    {
        // 可能会出现异常的语句
        x = func01(10, 0);
    }
    // 接受const char*类型的异常
    catch (const char *_str_error)
    {
        cout << _str_error << endl;
    }
    // 这里输出的仍旧是x初始化的数值100,因为func函数出现异常并没有执行异常下面的语句
    cout << "x = " << x << endl;
}

栈解旋

// 栈解旋
class Text
{
public:
    Text()
    {
        cout << "构造函数的调用" << endl;
    }
    ~Text()
    {
        cout << "析构函数的调用" << endl;
    }
};
void func02()
{
    Text t1;
    throw 1;
    // 析构函数的发生是在异常处理之前执行
    Text t2;
}
void text02()
{
    try
    {
        func02();
    }
    catch (int errorCode)
    {
        cout << "errorCode:" << errorCode << endl;
    }
    cout << "text02函数执行完成" << endl;
}

完整代码

#include <iostream>
using namespace std;
// 一般的异常
int func01(int _x, int _y)
{
    if (_y == 0)
        throw "除数=0";
    return _x / _y;
}
// int func(int x, int y) throw(int, char, char *); //可以抛出int,char char*类型 若抛出float则在try{}模块检测不到
// int func(int x, int y) throw();                  //不会抛出异常
// int func(int x, int y)                           //可以抛出任意类型的异常
void text01()
{
    int x = 100;
    try
    {
        // 可能会出现异常的语句
        x = func01(10, 0);
    }
    // 接受const char*类型的异常
    catch (const char *_str_error)
    {
        cout << _str_error << endl;
    }
    // 这里输出的仍旧是x初始化的数值100,因为func函数出现异常并没有执行异常下面的语句
    cout << "x = " << x << endl;
}
// 栈解旋
class Text
{
public:
    Text()
    {
        cout << "构造函数的调用" << endl;
    }
    ~Text()
    {
        cout << "析构函数的调用" << endl;
    }
};
void func02()
{
    Text t1;
    throw 1;
    // 析构函数的发生是在异常处理之前执行
    Text t2;
}
void text02()
{
    try
    {
        func02();
    }
    catch (int errorCode)
    {
        cout << "errorCode:" << errorCode << endl;
    }
    cout << "text02函数执行完成" << endl;
}
int main(int argc, char **argv)
{
    text01();
    text02();
    return 0;
}

运行结果

总结: 类遇到异常处理的时候,析构函数的发生是在异常处理之前执行,异常后面的代码仍旧不会执行


相关文章
|
2天前
|
设计模式 算法 C++
【C++初阶】12. Stack(栈)和Queue(队列)
【C++初阶】12. Stack(栈)和Queue(队列)
43 3
|
2天前
|
算法 编译器 C语言
【C++ 异常】C++ 标准库异常类及其应用
【C++ 异常】C++ 标准库异常类及其应用
34 0
|
2天前
|
安全 算法 C++
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误(三)
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误
48 0
|
2天前
|
存储 安全 算法
【C/C++ 关键字 函数说明符 】C++ noexcept 关键字(指定某个函数不抛出异常)
【C/C++ 关键字 函数说明符 】C++ noexcept 关键字(指定某个函数不抛出异常)
27 0
|
2天前
|
存储 设计模式 C语言
C++中的栈和队列
C++中的栈和队列
10 0
|
2天前
|
SQL 安全 程序员
C++:异常
C++:异常
22 7
|
2天前
|
小程序 编译器 Linux
C++ 异常原理:以一个小程序为例
作者在调查某个 bug 时涉及到 C++ 异常,借此机会以本文把 C++ 异常机制梳理清楚供大家参考。
|
2天前
|
设计模式 算法 编译器
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
13 0
|
2天前
|
SQL 缓存 安全
【C++入门到精通】异常 | 异常的使用 | 自定义异常体系 [ C++入门 ]
【C++入门到精通】异常 | 异常的使用 | 自定义异常体系 [ C++入门 ]
11 2
|
2天前
|
设计模式 C语言 C++
【C++进阶(六)】STL大法--栈和队列深度剖析&优先级队列&适配器原理
【C++进阶(六)】STL大法--栈和队列深度剖析&优先级队列&适配器原理