我来到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块的执行命名为目的。
但是不管怎么说,最终的阻止不会被召唤?
来源:
答案 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
}
}