当从另一个异常展开堆栈时引发异常时会发生什么?

2024-04-17

例如在下面的代码中:

#include <iostream>
using namespace std;
class A {
     public:
           A() { cout << "A::A()" << endl; }
           ~A() { cout << "A::~A()" << endl; throw "A::exception"; }
     };
class B {
     public:
           B() { cout << "B::B()" << endl; throw "B::exception"; }
           ~B() { cout << "B::~B()"; }
     };
int main(int, char**)
{
     try {
           cout << "Entering try...catch block" << endl;
           A objectA;
           B objectB;
           cout << "Exiting try...catch block" << endl;
     }
     catch (char* ex) {
           cout << ex << endl;
     }
     return 0;
}

B的析构函数抛出异常,调用A的析构函数,同时展开堆栈,导致抛出另一个异常。 程序会有什么反应?


简短的回答?砰,应用程序终止。

From 准位移 http://www.parashift.com/c++-faq-lite/exceptions.html:

在堆栈展开期间,所有这些堆栈帧中的所有本地对象都将被破坏。如果这些析构函数之一抛出异常(假设它抛出 Bar 对象),则 C++ 运行时系统将处于双输的境地:它是否应该忽略 Bar 并最终进入

} catch (Foo e) { 

它最初的目的地是哪里?它是否应该忽略 Foo 并寻找

} catch (Bar e) { 

处理程序?没有好的答案——任何一种选择都会丢失信息。

所以C++语言保证它会调用terminate()此时,并且terminate()杀死该进程。砰,你死定了。

Stack Overflow 上的相关问题:

  • 为什么在 C++ 中第二次调用析构函数会出现未定义行为? https://stackoverflow.com/questions/2771567/why-exactly-is-calling-the-destructor-for-the-second-time-undefined-behavior-in-c
  • 抛出异常 析构函数 https://stackoverflow.com/questions/130117/throwing-exceptions-out-of-a-destructor
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当从另一个异常展开堆栈时引发异常时会发生什么? 的相关文章

随机推荐