34

例外がスローされなかった場合にのみブロックを実行する方法はありますか?

私が思いつくことができる最高のものはこれです:

bool exception = false;
try{
    // something
}catch(Exception e){
    exception = true;
}finally{
    if(!exception){
        // i can do what i want here
    } 
}

より良い方法はありますか?

4

7 に答える 7

54

try確かにあります:ブロックの一番下に置きます。

try{
    // something
    // i can do what i want here
}catch(Exception e){
    // handle exception
}

これは、「必要なもの」がスローされた場合、例外がローカルでキャッチされるという意味で、元のコードと完全に同等ではありません (これは元のスキームでは発生しません)。これはあなたが気にするかもしれないし気にしないかもしれないことであり、異なる振る舞いが正しいものである可能性も十分にあります。

古い動作に戻したい場合はfinally、「例外がない場合」条件を記述するためだけに を必要としないこのバリアントを使用することもできます。

var checkpointReached = false;
try{
    // something
    checkpointReached = true;
    // i can do what i want here
}catch(Exception e){
    if (checkpointReached) throw; // don't handle exceptions after the checkpoint
    // handle exception
}
于 2012-05-03T12:31:34.247 に答える
7

finally 句は必要ありません。

解決策 :

bool exception = false;
try{
    // something
}catch(Exception e){
    exception = true;
}
if(!exception){
     // u can do what u want here
} 

通常、テストする必要さえないように、catch 句に return を入れるだけです。

try{
    // something
}catch(Exception e){
   // do things
   return;
}
// u can do what u want here

または(ユースケースに応じて、一般的にあまり明確ではありません。特に、複数の例外が予想される場合-try-catchネストをしたくない...):

try{
    // something
    // u can do what u want here
}catch(Exception e){
   // do things
}
于 2012-05-03T12:31:42.677 に答える
5

doSomethingブロック内の最後のステートメントであり、スローされないコードを構造化できますか?

bool exception = false;
try{
  // something
  doSomething();
} catch {
}
finally {
}
于 2012-05-03T12:32:09.290 に答える
3

はい、あります: try ブロックの最後に置いてください :)

于 2012-05-03T12:32:33.567 に答える
1

コードに問題はありませんが、不要です。実行したいコードを try ブロックの最後に置くだけです:

try {
    ...
    // No errors to this point, run what you wanted to run in the finally.
}
catch(Exception e) {
    ...
}
于 2012-05-03T12:33:04.977 に答える
1

いいえ-あなたが持っているのは、おそらくC#でそれを行うための最良の方法です.

これは、次のことを前提としています。

  • 「ここでやりたいことができる」というコードをtryブロックの一番下で実行したくありません。catch(おそらく、そのコードの例外をメインブロックで処理したくないためです。)
  • 「ここでやりたいことができる」というコードが完全に構造の外で実行されることは望ましくありませんtry...catch...finallyfinally(おそらく、そのコードをブロック内にある他のコードの前に実行したいためです。)
于 2012-05-03T12:31:53.950 に答える