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

C# 如果catch和finally块都抛出异常,会发生什么?,c#,java,.net,exception,try-finally,C#,Java,.net,Exception,Try Finally,如果catch和finally块都抛出异常会发生什么情况?抛出最后一个异常。当catch抛出异常时,finally块将运行,然后带着异常退出。 如果finally块抛出异常,则该块将带着异常退出。当finally块抛出异常时,它将有效地隐藏从catch块抛出的异常,并将是最终抛出的异常。因此,重要的是在捕获时记录异常,或者确保finally块本身不会抛出异常,否则您可能会抛出被抑制且从未见过的异常。adrianbanks已经很好地回答了这一问题,但下面的帖子应该很有趣: 你好,我想你的答案是错的

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

抛出最后一个异常。

当catch抛出异常时,finally块将运行,然后带着异常退出。
如果finally块抛出异常,则该块将带着异常退出。

finally
块抛出异常时,它将有效地隐藏从
catch
块抛出的异常,并将是最终抛出的异常。因此,重要的是在捕获时记录异常,或者确保finally块本身不会抛出异常,否则您可能会抛出被抑制且从未见过的异常。

adrianbanks已经很好地回答了这一问题,但下面的帖子应该很有趣:

你好,我想你的答案是错的,我在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");
}

这不会最终导致excute,

那么最后会抛出什么异常呢?从finally块还是从catch块?最后引发的异常:D有两种不同的组合,即捕捉和最后一个块都可能有不同的嵌套模式。您可能需要添加一个代码片段来概述您正在考虑的情况。@Justin:(不确定是否会通知您……)我回滚了您的标记更改,因为(1)您删除了Java,这会极大地改变问题的范围;(2)您添加了VB.NET,虽然在许多方面都是正确的,这里的事情不是这样的。。。(换句话说,我有点同意这一点,或者也可以删除C#,因为有.NET)。@MarkHurd问题是一个或多个答案链接到了.NET特定的解决方案——我不能保证答案在Java中的有效性。其他VB.Net问题也有这个问题的链接(因为答案是一样的)。@Justin:是的,这是C#标记问题的问题;答案可能与VB.NET(以及所有其他.NET语言)有关,但提问者的权力决定了标签,而不是答案。(虽然我们有时会在答案被接受后添加与解决方案相关的标记,以帮助搜索。)在这种情况下,Java标记意味着有进一步答案或解释的空间。请注意,当前接受的答案实际上并不涉及特定的语言。我在博客上添加了一条评论,但控制台应用程序的结果似乎是因为CLR在筛选阶段报告(第一个)未处理的异常(当处理VB.NET的
时,
子句时),可能是为了调用调试器,然后找到第一个异常的行。最简单的方法是在
抛出
之前,在
最后
中打印一些内容。记录第一个异常,然后处理
最后
,并记录第二个异常。此occors适用于.NET Framework 1.1至3.5。NET 4.0仅报告第一个异常。(1.0和4.5不可用。)尝试这样做只是为了确保我能从try中的块代码控制每个异常消息。我单独抛出异常