什么时候使用try multi catch?

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)

在抛出多个异常时,我们应该在哪些理想情况下使用上述选项?

NIN*_*OOP 7

根据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)