2011-08-26 9 views
12

これらのいずれかが危険ですか? 1つ良いですか?それとも、あなたが決めるためにダーツを投げ捨てるものの1つですか?try&catchで戻って、最後に戻る?

私は今、私がどのように機能するかを最終的に理解することがこれをしたい:

try { 
    stuff that changes something... 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
} 
finally { 
    stuff.close(); 
    return something; 
} 

をしかし、私が見てきた:

try { 
    stuff that changes something... 
    return something; 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
    return something; 
} 
finally { 
    stuff.close(); 
} 
+1

@Dlev - 最初のものが有効なC#でないため、実行できません。では、どうすればそれが好ましいのでしょうか?この質問は本当にもう一度尋ねるべきです。コードが実際に有効なコードであるか、そうでなければ無意味なコードです。 –

+0

@Ramhoundおっと、私は前者が法的なC#ではないことを意味しました。後者は実際には構文的に有効です。 – dlev

答えて

17

あなたがすることができませんreturnfinallyから。あなたは、コンパイラエラーが発生します。

Control cannot leave the body of a finally clause


ターゲットクラスがIDisposableを実装する場合、私は次のだろう。その意志場合

using (stuff s = new stuff()) 
{ 
    return stuff; 
} 

または

using (stuff s = new stuff()) 
{ 
    try 
    { 
     // do stuff 
     return stuff; 
    } 
    catch (Exception ex) 
    { 
     // do logging or another stuff 
     return something; 
    } 
} 

はあなたのためにDispose()を呼び出します。必要/可能であること。

+0

Doh!次回に尋ねる前にコンパイルしてみてください。それは、最終的に非常に注目されるほどユニークなので、コントロールが最後に残すことはできないということが理にかなっています。 – ChuckNeuros

+2

@ user540903:まあ、はい、あなたはそれを編集したはずです。しかし、あまりにもひどく自分自身を打ち負かさないでください。最終的に返品が合法である言語があり、その言語には結果としてかなり奇妙なコントロールフローのセマンティクスがあります。一般的には合理的な質問ですが、C#ではそうではありません。 –

+0

@エリック私はかなりJavaです。これらの言語の1つです。私が思い出したことから、最近の 'return'は以前のものを上書きします。' try {throw new BlahException(); }キャッチ{return 1; } finally {return 2; } 'は実際には' 2'を呼び出し側に返します。 – dlev

17

個人的に私はどちらを行うだろうし、あなたは彼らが失敗した場合に設定/開かれていなかったかもしれないとして、オブジェクトの/処分を閉鎖する必要があることを確認し、finally声明の中でも


try { 
    stuff that changes something... 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
} 
finally { 
    stuff.close();  
} 
return something; 

を使用します。

はまた、第二のアプローチにはリスクはありませんここIs it bad practice to return from within a try catch finally block?

+1

私はこれに同意します.abatishchevはあなたが最終的には戻ってこないと言います。私はあなたがキャッチでリターンを持つべきではないと思います。試しにキャッチして、あなたがそれを返すことを望んでいない場合、どちらかの方法で戻ってきて、あなたが再スローすればそれは決して戻ってこないでしょう。どちらの方法でも、return文が1つだけ必要ではありません2 –

+1

try/catch/finallyから戻ると、最終的には "構造化プログラミング"とはみなされません。私はティムとベンに同意します。 –

0

参照してください。しかし、例外の場合には異なる値を返すことができます。

+1

したがって、変数を返し、tryブロックとcatchブロックで異なる値に設定しますが、try/catachブロック全体の外側には1つだけ戻ります。 –

+0

は、変数の値を返すことで、例外の場合に異なる値を返すこともできます。 –