2012-05-03 8 views
18

例外がスローされなかった場合にのみブロックを実行する方法はありますか?finallyを試してください:例外がスローされない場合は何かをしてください

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

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

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

+0

tryブロック内に「返品」がありますか? – Guillaume

+0

答えはそれらの間に18票と1票の質問がありますか? –

+0

@Guillaumeノーリターン – lowerkey

答えて

33

確かにあります: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 
} 
+0

+1、素敵な答え。 –

+0

このパターンを繰り返すとtry-catch imbricationが発生するという問題があります。したがって、予想される例外がほとんどない場合にのみ推奨されます。 –

+0

@dystroy:どういう意味なのかよく分かりませんか? – Jon

3

あなたドンfinally節が必要です。

ソリューション:

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

または(用途に応じて:あなたもテストする必要がないように

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

通常あなたは、単にあなたのcatch節でリターンを持っています通常はあまり明確ではない、特に複数の例外が予想される場合は、try-catch imbrications ...を望んではいけません。):

1

いいえ - あなたが持っているものはおそらくC#でそれを行うための最良の方法です。あなたはあなたtryブロックの下部に実行するようにコードを「私はここでやりたいことができ、」したくない

  • これは、と仮定しています。 (おそらく、あなたはそのコード内での例外をメインcatchブロックで扱うことにしたくないので。)

  • あなたはtry...catch...finallyの外に完全に実行するためにコード「私がここに欲しいものを行うことができます」したくありません構造。 (あなたはそのコードがfinallyブロック内で座っていますいくつかの他のコードの前に実行したいおそらくので。)
4

あなたはdoSomethingは、ブロックの最後の文であり、それは投げていないことをあなたのコードを構築することはできますか?

bool exception = false; 
try{ 
    // something 
    doSomething(); 
} catch { 
} 
finally { 
} 
+0

@ Jeff Fosternoはここで最終的にブロックする必要があります。 –

+1

私は、常に実行したいと思っていた定型的なクリーンアップコードがあると仮定しました。もしそうでなければ、間違いなく正しいです。それは冗長です。 –

2

はい、あります: は、tryブロックの最後にそれを置く:)

1

をあなたのコードと間違って何もありませんが、それは不要です。、

try{ 
    // something 

    try{ 
     // something else not interfering with first try 
    } catch(Exception innerEx){ 
     // something else threw this innerEx 
    } 

}catch(Exception outerEx){ 
    // something threw this outerEx 
} 

これは、一般的に悪い習慣と考えられているが:私はあなたがあなたの試し内部の試みを探していると信じて

try { 
    ... 
    // No errors to this point, run what you wanted to run in the finally. 
} 
catch(Exception e) { 
    ... 
} 
0

:単にあなたがtryブロックの下部に実行したいコードを置きます私はそれが旗のバージョンよりも好きです。

関連する問題