首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当从另一个异常中展开堆栈时抛出异常时会发生什么?

当从另一个异常中展开堆栈时抛出异常时会发生什么?
EN

Stack Overflow用户
提问于 2010-07-23 22:07:12
回答 1查看 4.8K关注 0票数 5

例如,在以下代码中:

代码语言:javascript
复制
#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的析构函数,导致抛出另一个异常。程序会有什么反应?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-23 22:09:25

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

来自parashift

在堆栈展开期间,所有这些堆栈帧中的所有局部对象都会被析构。如果其中一个析构函数抛出异常(假设它抛出了一个Bar对象),那么C++运行时系统将处于一种失败的境地:它是否应该忽略该Bar并以

代码语言:javascript
复制
} catch (Foo e) { 

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

代码语言:javascript
复制
} catch (Bar e) { 

操控者?没有好的答案--任何一个选择都会丢失信息。

因此,C++语言保证它将在此时调用terminate(),而terminate()将终止该进程。你死定了。

关于堆栈溢出的相关问题:

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3318887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档