两个异常发生时会发生什么?

时间:2010-03-13 20:03:05

标签: exception-handling

当程序有两个例外时,程序会表现什么。 而且他们都没有被抓住。 将调用什么类型的处理程序。 我们可以说两种例外都是不同类型的。 如果我不清楚我会道歉,但我觉得我已经让自己清楚了。 谢谢!!!

如果try块抛出异常并且退出try会破坏所有自动变量怎么办。让我们说一个是自动对象,它的析构函数再次抛出异常。现在我们有两个未被捕获的异常。我的问题基于这个事实。 谢谢!!

4 个答案:

答案 0 :(得分:6)

完全取决于语言。但是,在我知道的所有语言中,永远不会同时出现多个异常(在同一个线程中)。如果抛出异常,它会向上移动调用堆栈直到它被捕获,在此期间没有代码执行。如果未捕获异常,程序将在另一个程序被抛出之前崩溃。如果它被捕获,则异常不再“活动”,并且如果处理程序抛出新的异常,则旧的异常被遗忘。

答案 1 :(得分:5)

在CPU级别(在x86上),存在称为double fault的情况:

  

在x86架构上,如果处理器在尝试处理挂起的中断或异常时遇到问题,则会发生双重故障异常。

然而,这种“双重故障”是一种非常低级别的情况,只是操作系统内核所关注的。

答案 2 :(得分:0)

当发生异常时,编译器展开堆栈(关闭当前函数并返回,调用函数)。如果main中没有捕获异常,则称为abort函数。通过这个程序异常终止。

但是在展开堆栈期间如果发生了另一个异常(对于你的情况在析构函数中)而不是在此时间/点而没有到达main函数,编译器调用了abort函数来异常终止程序。

如果你知道析构函数中可能发生异常,那么你必须在析构函数中处理。在析构函数中,你应该使用catch块来捕获该异常。通过这种方式,生成的第二个异常将在析构函数中处理,并且此异常不会从析构函数中解脱出来,并且程序会因为一次生成两个异常而从崩溃中保存

Complier一次只处理一个例外。如果编译器发现多个异常,则调用中止函数,程序异常终止。

答案 3 :(得分:0)

很少有语言或框架可以很好地处理从早期异常中清除时发生的异常。有效处理这种情况需要清理代码知道“主线”上发生了什么异常(如果有的话)。从概念上讲,将这些信息提供给清理代码并不困难,但框架通常不会提供它。

否则,C ++中的正常行为是在从另一个异常清除期间发生异常时使系统硬崩溃;如果发生清除异常,Java和.NET语言通常会放弃任何挂起的异常。然而,较新版本的Java包含一个功能(如果使用的话)将更好地处理这些事情。在try-with-resources块中,在没有其他异常待处理时清理资源时发生的异常将被正常处理;但是,如果异常处于挂起状态,则挂起的异常将保持挂起但将新异常添加到其“抑制异常”列表中。如果有一种方法可以指定特定的finally块应该以相同的方式运行,那将会很好,但我不知道它的任何特征。