9

finallyネストされた でどのように機能しtry/catchますか?
例:

try{  
//code

}  
catch(SomeException e){  
   //code  
   try{  
      //code  
   }  
   catch(OtherException e){  
     //code  
   }  
}  
catch(SomeOtherException e){    
  //code  
} 

置くのに最適な場所はどこfinallyですか? または、ネストされた外側にtryも配置する必要がありますか?

4

3 に答える 3

24

finallyどちらのブロックで何が起こってもブロック内のコードを実行したい場合は、外側に配置しtryます。最初のブロック内で何が起こっても実行したい場合はtry、そこに置きます:

try{  // try/catch #1
  //code block #1

}  
catch(SomeException e){  

   //code block #2

   try{  // try/catch #2
      //code block #3
   }  
   catch(OtherException e){  
     //code block #4
   }  
   finally {
     // This code runs no matter what happens with try/catch #2 (so
     // after code block #3 and/or #4, depending on whether there's
     // an exception). It does NOT run after code block #1 if that
     // block doesn't throw, does NOT run after code block #2 if
     // that block DOES throw), and does not run if code block #1
     // throws SomeOtherException (code block #5).
   }
}  
catch(SomeOtherException e){    
  //code block #5
} 
finally {
  // This code runs no matter what happens with EITHER
  // try/catch #1 or try/catch #2, no matter what happens
  // with any of the code blocks above, 1-5
}

より簡単に:

try {
   // covered by "outer" finally
}
catch (Exception1 ex) {
   // covered by "outer" finally

   try {
     // Covered by both "inner" and "outer" finallys
   }
   catch (Exception2 ex) {
     // Covered by both "inner" and "outer" finallys
   }
   catch (Exception3 ex) {
     // Covered by both "inner" and "outer" finallys
   }
   finally { // "inner" finally
   }
}
catch (Exception4 ex) {
   // covered by "outer" finally
}
finally { // "outer" finally
}
于 2012-12-12T08:37:51.590 に答える
3

それは、finally ブロックのコードを実行する場所によって異なります。

try{  //Try ROOT
//code

}  
catch(SomeException e){  //Catch ROOT ONE
   //code  
   try{  //Try NEST
      //code  
   }  
   catch(OtherException e){  //Catch NEST
     //code  
   }
   finally{
     //This will execute after Try NEST and Catch NEST
   }
}  
catch(SomeOtherException e){    //Catch ROOT TWO
  //code  
}
finally{
  //This will execute after try ROOT and Catch ROOT ONE and Catch ROOT TWO
}

必要な機能に依存する最適な場所はありません。ただし、すべての try catch ブロックの後にのみ finally ブロックを実行する場合は、最後のルート catch ブロックの後に配置する必要があります。

于 2012-12-12T08:41:20.097 に答える
1

ドクから

try ブロックが終了すると、finally ブロックが常に実行されます。これにより、予期しない例外が発生した場合でも、finally ブロックが実行されます。しかし、finally は例外処理以外にも役立ちます。これにより、プログラマーはクリーンアップ コードが return、continue、または break によって誤ってバイパスされるのを防ぐことができます。例外が予想されない場合でも、最終ブロックにクリーンアップ コードを配置することは常に良い方法です。

最後に必要な場所に配置することをお勧めします。

try{  
  //code

 }    
 catch(SomeException e){  // 1
     try{  //Try Block 
       //code  
      }  
     catch(OtherException e){  //2
       //code  
      }
     finally{
       //This will execute after Try Block and Catch Block 
      }
 }  
catch(SomeOtherException e){  //3
  //code  
 }
finally{
   //This will execute after 1 and 2 and 3
 }

詳細については、以下のリンクをご覧ください。

  1. 最終ブロック
  2. finally ブロックは常に実行されますか?
于 2012-12-12T08:41:06.020 に答える