Java失去了异常

时间:2014-09-09 18:51:46

标签: java exception try-catch finally

假设我们有以下方法(非常简化的版本):

    void doSomething() {
      try {
        throw new Exception("A");
      } finally {
        throw new Exception("B");
      }
    }

在调用方法中捕获了消息“B”的异常。基本上,有没有办法知道在try块中抛出了哪个异常,如果finally块也抛出一些异常?假设方法doSomething()无法修改。

3 个答案:

答案 0 :(得分:6)

Section 14.20.2 of the JLS州:

  

如果由于抛出值V,......

而突然完成try块的执行

...

  

如果finally块因为S而突然完成,那么try语句突然完成,原因是S(并且丢弃并抛弃了值V的抛出)。

Java必须丢弃原始异常V("突然完成")并且整个try-finally阻止"突然完成"使用Sfinally 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子句抛出的异常通常会导致其他异常被遗忘。道德:尽量不要从最终条款中抛出异常。