例外がスローされなかった場合にのみブロックを実行する方法はありますか?
私が思いつくことができる最高のものはこれです:
bool exception = false;
try{
// something
}catch(Exception e){
exception = true;
}finally{
if(!exception){
// i can do what i want here
}
}
より良い方法はありますか?
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
}
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
}
doSomething
ブロック内の最後のステートメントであり、スローされないコードを構造化できますか?
bool exception = false;
try{
// something
doSomething();
} catch {
}
finally {
}
はい、あります: try ブロックの最後に置いてください :)
コードに問題はありませんが、不要です。実行したいコードを try ブロックの最後に置くだけです:
try {
...
// No errors to this point, run what you wanted to run in the finally.
}
catch(Exception e) {
...
}
いいえ-あなたが持っているのは、おそらくC#でそれを行うための最良の方法です.
これは、次のことを前提としています。
try
ブロックの一番下で実行したくありません。catch
(おそらく、そのコードの例外をメインブロックで処理したくないためです。)try...catch...finally
。finally
(おそらく、そのコードをブロック内にある他のコードの前に実行したいためです。)