是否可以检测在我进入最终块之前是否发生了异常?
在Java中,有没有一种优雅的方法来检测在运行finally块之前是否发生了异常?在处理“close()”语句时,通常需要在最后的块中进行异常处理。理想情况下,我们希望同时维护这两个异常并将它们传播起来(因为它们都可能包含有用的信息)。我能想到的唯一方法是在 try-catch-final 作用域之外有一个变量来保存对引发异常的引用。然后将“已保存”异常与最终块中发生的任何异常一起传播。
有没有更优雅的方法来做到这一点?也许API调用会揭示这一点?
以下是我正在谈论的一些粗略代码:
Throwable t = null;
try {
stream.write(buffer);
} catch(IOException e) {
t = e; //Need to save this exception for finally
throw e;
} finally {
try {
stream.close(); //may throw exception
} catch(IOException e) {
//Is there something better than saving the exception from the exception block?
if(t!=null) {
//propagate the read exception as the "cause"--not great, but you see what I mean.
throw new IOException("Could not close in finally block: " + e.getMessage(),t);
} else {
throw e; //just pass it up
}
}//end close
}
显然,还有许多其他类似的笨拙可能涉及将异常保存为成员变量,从方法返回它等。但我正在寻找一些更优雅的东西。
也许是类似或类似的东西?就此而言,其他语言是否有优雅的解决方案?Thread.getPendingException()
这个问题实际上是从另一个问题中的评论中产生的,该问题提出了一个有趣的问题。