【问题标题】:What happens if both catch and finally blocks throw exception?如果 catch 和 finally 块都抛出异常会发生什么?
【发布时间】:2023-04-01 12:19:01
【问题描述】:

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

【问题讨论】:

  • catch 和 finally 块有不同的组合|嵌套模式。您可能需要添加代码 sn-p 来概述您正在考虑的情况。
  • @Justin:(不确定您是否会收到通知...)我回滚了您的标签更改,因为(1)您删除了 Java,这确实极大地改变了问题的范围和(2)您添加了 VB.NET,虽然在许多方面是正确的,但这并不是这里的做法......(换句话说,我有点同意这一点,或者也删除了 C#,将其视为 .NET在那里)。
  • @MarkHurd 问题是一个或多个答案链接到 .Net 特定的解决方案 - 我不能代表 Java 中答案的有效性。其他 VB.Net 问题也有指向这个问题的链接(因为答案是一样的)。
  • @Justin:是的,这就是 C# 标记问题的问题;答案可能与 VB.NET(以及所有其他 .NET 语言)相关,但被认为是提问者的权力决定了标签,而不是答案。 (虽然我们有时会在答案被接受后添加与解决方案相关的标签,以帮助搜索。)在这种情况下,Java 标签意味着有更多答案或解释的空间。请注意,当前接受的答案实际上根本不涉及特定语言。

标签: c# java .net exception try-finally


【解决方案1】:

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

【讨论】:

  • 一直很想这样做,只是为了确保我可以控制 try 中块代码中的每条异常消息。我单独抛出异常
【解决方案2】:

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

【讨论】:

  • 那么最后会抛出什么异常呢?从 finally 块还是从 catch 块?
  • 最后抛出的异常。 :D
【解决方案3】:

最后抛出的异常被抛出。

【讨论】:

    【解决方案4】:

    adrianbanks 已经很好地回答了它,但是下面的帖子应该很有趣: Interesting Exception Results: Throwing Exceptions From the Finally Block

    【讨论】:

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

    你好 Nwaman,我认为你的回答是错误的

    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");
    }
    

    这不会导致最终执行,

    【讨论】:

      猜你喜欢
      • 2017-02-10
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      相关资源
      最近更新 更多