假设我们有以下方法(非常简化的版本):
void doSomething() {
try {
throw new Exception("A");
} finally {
throw new Exception("B");
}
}
在调用方法中捕获了消息“B”的异常。基本上,有没有办法知道在try块中抛出了哪个异常,如果finally块也抛出一些异常?假设方法doSomething()无法修改。
答案 0 :(得分:6)
如果由于抛出值V,......
而突然完成try块的执行
...
如果finally块因为S而突然完成,那么try语句突然完成,原因是S(并且丢弃并抛弃了值V的抛出)。
Java必须丢弃原始异常V
("突然完成")并且整个try-finally阻止"突然完成"使用S
(finally
Exception
," B")。
无法检索原始try
阻止例外" A",它对应于JLS中的V
。
答案 1 :(得分:0)
finally块将使用try-catch块中的任何返回值或异常。
基本上,最后的条款是为了确保正确释放资源。但是,如果在finally块中抛出异常,它将使用try-catch块中的任何返回值或异常。
答案 2 :(得分:0)
您可以手动执行此操作,但它有点像PITA。
public class ExceptionException
{
public static void main( String[] args )
throws Exception
{
Exception saved = null;
try {
throw new Exception( "A" );
} catch( Exception ex ) {
saved = ex;
} finally {
try {
throw new Exception( "B" );
} catch( Exception ex ) {
if( saved != null )
ex.addSuppressed( saved );
}
}
}
}
正如rgettman所说,JLS表示从finally子句抛出的异常通常会导致其他异常被遗忘。道德:尽量不要从最终条款中抛出异常。