如果catch块和finally块都抛出异常会发生什么?

36

如果catch和finally块都抛出异常会发生什么?


使用catch块和finally块可以有不同的组合|嵌套模式。您可能希望添加代码片段以概述您正在考虑的情况。 - H H
@Justin:(不确定你是否会收到通知...)我撤回了你对标签的更改,因为(1)你删除了Java,这显着改变了问题的范围,(2)你添加了VB.NET,虽然在很多方面是正确的,但并不是我们这里的做法......(换句话说,我有点同意那个想法,或者也可以删除C#,因为.NET已经存在)。 - Mark Hurd
@MarkHurd 问题在于其中一个或多个答案链接到了 .Net 特定的解决方案 - 我无法确定这些答案在 Java 中是否有效。此外,其他 VB.Net 的问题也链接到了这个问题(因为答案是相同的)。 - Justin
@Justin:是的,这就是C#标记问题的问题;答案可能与VB.NET(以及所有其他.NET语言)相关,但有权利决定标签的是提问者,而不是回答者。 (尽管我们有时会在接受答案后添加与解决方案相关的标签,以帮助搜索。)在这种情况下,Java标记意味着有进一步的答案或解释的余地。请注意,当前接受的答案实际上根本没有涉及特定的语言。 - Mark Hurd
5个回答

32
finally块抛出异常时,它将有效地隐藏来自catch块抛出的异常,并且最终被抛出的异常将是finally块抛出的异常。因此,在捕获异常时记录异常或确保finally块不会抛出异常非常重要,否则可能会导致抑制并永远不会看到抛出的异常。

我一直很想这样做,只是为了确保我控制try块内的每个异常消息。我单独抛出异常。 - Marcel Djaman

6

当catch捕获异常时,finally块将会被执行,然后以异常退出。如果finally块抛出异常,则该块将以异常退出。


最后会抛出什么异常?是来自finally块还是catch块? - Arthur
4
最后一个抛出的异常。 :D - NawaMan

5
最后抛出的异常被抛出。

4

我在博客上添加了一条评论,但控制台应用程序的结果似乎是因为CLR在过滤阶段(处理VB.NET的“When”子句时)报告了(第一个)未处理的异常,可能是为了调用调试器,然后定位第一个异常的行。最简单的方法是在throw之前在finally中打印一些内容。首先记录第一个异常,然后处理finally并记录第二个异常。这适用于.NET Framework 1.1到3.5。.NET 4.0仅报告第一个异常。(1.0和4.5不可用。) - Mark Hurd

-4

嗨,Nwaman,我认为你的答案是错的。我在 Windows 应用程序中进行了测试,发现如果编写像下面这样的程序:

try
{
    string s = "hu";
    int i = int.Parse(s);
}
catch (Exception ex)
{
    string s = "hu";
    int i = int.Parse(s);
    throw new Exception();
}
finally
{
    MessageBox.Show("hi");
}

而且这最终不会被执行,


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接