异常没有被捕获但程序退出并最终被执行

时间:2016-01-18 03:17:43

标签: java try-catch-finally

我正在对linux服务器进行压力测试。但是我发现我的java应用程序总是退出而没有任何错误消息。所以我使用try-catch-finally并希望获得有关退出原因的一些信息。代码如下: / p>

try{
// the code which make my program exit without any error log
}catch(Throwable e){
//print some log
}finally{
// print some log
}

我发现catch子句永远不会被执行但是当我的程序退出时会执行finally日志。任何人都可以告诉我这怎么可能发生?我很确定try {}中的代码退出时出现了一些问题而不是正常退出。 由于try {}中的代码正在执行while循环并消耗很多内存,因此,原因是jvm退出是因为内存已用完了吗?

2 个答案:

答案 0 :(得分:2)

我看到两种可能性:

  1. 你错了try - 块正在抛出异常:也许没有抛出异常,或者 抛出异常,但它正在被抛出在try - 块结束之前捕获。
    • 您可以通过在try - 块末尾添加日志记录语句并在任何可能退出的returnbreakcontinue语句之前立即进行复核try - 过早阻止。
  2. 您捕获的异常类型不是通常的java.lang.Throwable,而是您明确定义和/或导入的其他Throwable类。
    • 您可以通过将Throwable更改为更明确的java.lang.Throwable来仔细检查。

答案 1 :(得分:1)

  

我发现catch子句永远不会执行,但是当程序退出时会执行finally日志。

这意味着try块不会抛出异常 1

无论try块和所选catch块(如果有)如何终止,都将执行finally块。

但是,也可能是关于catch子句的“发现”不正确。

  

任何人都可以告诉我这怎么可能发生?

见上文。

  

我非常确定try {}中的代码退出时遇到了一些问题,而不是正常退出。

有什么证据?

  

由于try {}中的代码正在执行while循环并消耗大量内存,因此原因可能是jvm退出,因为内存已用完了吗?

这会导致OutOfMemoryError,而catch的{​​{1}}块应该会抓住它。

唯一可能Throwable块引发异常并且try的捕获不会似乎工作的唯一情况是{{1} }它本身会抛出另一个异常......然后它会执行你想要做的事情(即记录错误)。如果第一个例外是Throwable,则该场景可能。如果在catch块的范围退出时GC无法释放任何内存,则如果创建对象需要日志记录代码,则可能会抛出第二个OOME。

应该注意的是,抓住OutOfMemoryError是危险的。它捕获了不应被捕获的各种try异常,因为它们不可恢复。坏事可能发生。

1 - 从理论上讲,代码中Throwable可能不是Error,但只有疯狂的人会编写并使用自己的Throwable异常类。 ..然后忘记他们已经这样做了:-)。功能