gpt4 book ai didi

c++ - 为什么 C++ 偏向于析构函数的异常?

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:35 27 4
gpt4 key购买 nike

#include <iostream>
using namespace std;
class Cls
{
public:
~Cls()
{
throw "exp";
}
};

int main()
{
try
{
Cls c;
throw "exp";
}
catch (...)
{
cout << "Why this doesn't call" << endl;
}
}

当我执行这段代码时,它不会进入 catch block 。并给出以下异常(exception), enter image description here

但是,当我不加修改地运行这段代码时,它会进入 catch block 。

int main()
{
try
{
throw "exp";
throw "exp";
}
catch (...)
{
cout << "Why this doesn't call" << endl;
}
}

输出: enter image description here

上面的代码都抛出了2个异常,那为什么Compiler偏向于析构函数的情况呢?

最佳答案

在第一种情况下,您首先从 try block 中抛出,然后堆栈展开从 Cls 的析构函数中抛出。所以你有两个异常需要处理。 C++ 通过调用 terminate 来处理这种情况。

由于析构函数抛出的特殊性,C++11 定义所有析构函数默认都是noexcept。那么即使没有其他异常需要处理,来自析构函数的异常也会导致 terminate 被调用。

第二种情况没问题,因为一旦抛出第一个异常,try block 就会被保留,异常会在 catch block 中处理。

关于c++ - 为什么 C++ 偏向于析构函数的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22398206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com