我正在对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退出是因为内存已用完了吗?
答案 0 :(得分:2)
我看到两种可能性:
try
- 块正在抛出异常:也许没有抛出异常,或者 抛出异常,但它正在被抛出在try
- 块结束之前捕获。
try
- 块末尾添加日志记录语句并在任何可能退出的return
或break
或continue
语句之前立即进行复核try
- 过早阻止。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
异常类。 ..然后忘记他们已经这样做了:-)。功能