为什么我会在没有错误处理的情况下直接重新抛出异常

时间:2014-06-13 11:08:39

标签: java exception gzip lang gzipoutputstream

我来到Base64编码的一段代码。在读它的时候,我偶然发现了这样的事情:

    try {
      // GZip -> Base64 -> ByteArray
      baos = new java.io.ByteArrayOutputStream();
      b64os = new OutputStream( baos, ENCODE | options );
      gzos  = new java.util.zip.GZIPOutputStream( b64os );

      gzos.write( source, off, len );
      gzos.close();


    }   // end try
    catch( java.io.IOException e ) {
      // Catch it and then throw it immediately so that
      // the finally{} block is called for cleanup.
      throw e;
    }   // end catch
    finally {
      try{ gzos.close();  } catch( Exception e ){}
      try{ b64os.close(); } catch( Exception e ){}
      try{ baos.close();  } catch( Exception e ){}
    }   // end finally

正如您所看到的,IOException在catch块中被捕获并立即重新抛出并且它似乎不是一个错误,因为注释甚至描述了该操作并将finally块的执行命名为目的。

但是不管怎么说,最终的阻止不会被召唤?

来源:

Base64-De/Encoder (Public Domain) (Author: Robert Harder)

1 个答案:

答案 0 :(得分:0)

在某些情况下,您可能希望捕获并重新抛出异常。记录,清理仅为生成异常的代码所知的本地资源,可能是其中一些原因。

异常将继续在层中冒泡,直到它到达其他一些捕获它并且不会重新抛出它的代码,否则它将到达异常堆栈的顶部,程序可以通过报告异常退出。

在上面的代码中,由于您不想在您的图层处理异常,因此在将异常再次抛出到较高层之前,需要释放一些资源,例如gzos, baos, b64os。一旦catch and re-throw,您的finally block就可以执行并清理所持有的资源。

有时您可能还想用更多信息来包装异常。例如:

public void function() throws BaseException {
    try {
      ....
    } catch (IOException e) {
         throw new BaseChildException(e) // BaseChildException is a subclass of BaseException
    }
}