San*_*age 4 java exception try-catch
我不明白何时使用多捕获.我看到一些帖子,编译时间类型的多捕获异常是最接近的超类型的多个异常类型.
可以说有异常类型A,B和它们最接近的超类型C.
选项1
try{//whatever}
catch(A|B ex){//whatever}
Run Code Online (Sandbox Code Playgroud)
选项2
try{//whatever}
catch(C ex){//whatever}
Run Code Online (Sandbox Code Playgroud)
选项3
try{//whatever}
catch(A ex){//whatever}
catch(B ex){//whatever}
Run Code Online (Sandbox Code Playgroud)
在抛出多个异常时,我们应该在哪些理想情况下使用上述选项?
根据Oracle文档,新的多捕获块的显着点是:
catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}
Run Code Online (Sandbox Code Playgroud)
如果catch块处理多个异常类型,则catch参数隐式为final.在此示例中,catch参数ex是final,因此您无法在catch块中为其分配任何值.通过编译处理多个异常类型的catch块生成的字节码比编译许多每个只处理一种异常类型的catch块更小(因而更优越).处理多个异常类型的catch块在编译器生成的字节码中不会产生重复; 字节码没有异常处理程序的复制.
如果可以不同的方式处理异常,那么我相信您应该单独捕获它们.如果异常处理对于多个异常是相同的,那么您可以使用多捕获块.
try{//whatever}
catch(A ex){//do something specific for A}
catch(B ex){//do something specific for B}
try{//whatever}
catch(C ex){
//C is superclass of A and B and you are not concerned about the specific type
// will catch even other exceptions which are instanceof C
}
try{//whatever}
catch(A|B ex){//do the same thing for both A and B}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1362 次 |
| 最近记录: |