异常和错误报告顺序

Posted

技术标签:

【中文标题】异常和错误报告顺序【英文标题】:Exceptions and errors report order 【发布时间】:2011-11-23 17:50:56 【问题描述】:

哪些规则适用于以下代码:

    try 
        assert (false) : "jane";
     catch (Exception e2) 
        System.out.print("ae2 ");
     finally 
        throw new IllegalArgumentException();
    

资产已启用。

为什么会报告 IllegalArgumentException 而不是 AssertionError?是否有适用于这种情况的规则?

编辑: 对不起!在这个例子中应该有 assert (false)

【问题讨论】:

【参考方案1】:

finally 块始终运行。 assert 的计算结果为 true,因此 finally 块会引发异常。

此外,无论如何默认情况下都禁用断言,这可能是断言从未得到评估的原因。

附言

如果assert 评估为假,finally 将继续运行并抛出异常,而不是 AssertionError

请记住,finally 块始终运行,除非 JVM 在 try 块中停止。

【讨论】:

assert 不返回任何内容。 好的,准确地说是评估。【参考方案2】:

finally 块(或catch 块)中的未捕获异常会导致try 块中的任何异常被丢弃。有关详细信息,请参阅Java Language Specification § 14.20。从 Java 7 开始,封闭的 try/catch 块可以恢复丢弃的异常(如 here 所述)。

【讨论】:

【参考方案3】:

唯一能做任何事情的行是

throw new IllegalArgumentException();

assert true

什么都不做,即使做了也不会被catch(Exception抓到

【讨论】:

在这种情况下,答案是 finally 总是最后执行并替换除System.exit();之外的任何先前操作【参考方案4】:

finally 块将始终被执行。它不会执行的唯一情况是JVM关闭(即System.exit(-)。)

你可能会觉得有趣的是,即使你有:

try  
    return ...; 
 
finally  
    ...

finally 块仍然会被执行,并且会在方法退出之前执行

【讨论】:

感谢您的回答。我第一次在 *** 遇到来自 PUT 的人;) 哈,很高兴在这里找到大学同学 ;-) 祝你的 SCJP 好运。 谢谢,我以 95% 的成绩通过了今天的考试;)

以上是关于异常和错误报告顺序的主要内容,如果未能解决你的问题,请参考以下文章

C++/Windows:如何报告内存不足异常(bad_alloc)?

如何向 $.ajax 报告错误而不在 MVC 控制器中引发异常?

调解中心崩溃报告中的错误执行顺序

如何使用原生崩溃报告在 Swift 4 中实现异常/错误处理?

在 Python 中收集和报告多个异常的惯用方式

第八周课程总结&实验报告