2009-06-19 7 views

答えて

53

ため

try { 
    File.Open("FileNotFound.txt", FileMode.Open); 
} catch { 
    throw; 
} 

File.Open("FileNotFound.txt", FileMode.Open); 

よりも違いはありませんUIに渡します。

上記のcatchの節では、ロギング、トランザクションのロールバック、追加情報の追加のためのラップなど、何もせずに例外をキャッチして再スローするだけです。

しかし、

try { 
    File.Open("FileNotFound.txt", FileMode.Open); 
} catch(Exception ex) { 
    GetLogger().LogException(ex); 
    throw; 
} 

は任意の冗長性を含んでいないだろうとReSharperのは、文句を言うべきではありません。同様に、

try { 
    File.Open("FileNotFound.txt", FileMode.Open); 
} catch(Exception ex) { 
    throw new MyApplicationException(
     "I'm sorry, but your preferences file could not be found.", ex); 
} 

は冗長ではありません。

+2

キャッチアンドリスローを持つことは、キャッチを持たないことと全く同じではありません。スローサイトと最初に成功したcatchとの間のすべてのcatchブロックの例外フィルタは、 'finally'ブロックが実行される前に実行されます。 catch-and-rethrowは、その中のすべての 'finally'ブロックが実行され、それ以外の例外フィルタが実行される前に実行されます。 BTWは、キャッチアンドリスローが何かをするもう1つのより一般的なキャッチブロックである場合、resharperがうれしいです(キャッチアンドリスローは後者のキャッチブロックをバイパスするようになります)。 – supercat

17

上記のステートメントは、そこになかった場合と同じ動作をするためです。書き込みと同じ:File.Open(string, FileMode)への呼び出しは、その方法を見つけるでしょう、まったく同じ例外をサンプリングのいずれかで、その後、失敗した場合

File.Open("FileNotFound.txt", FileMode.Open); 
+0

だから、tryを使わずにコードの行を書く方が良いですか? – orandov

+8

はい。あなたが扱おうとしていないものを捕まえないでください。 –

+0

@orandov - 必要はありません。たとえば、IOExceptionをキャッチして、ApplicationExceptionから派生したより意味のある(ユーザーの観点から)例外をスローすることができます。 –

4

tryのコードがすでに例外をスローしているためです。

例外を再スローするだけでなく、catchブロックで何か他のことを行う場合は、例外をキャッチして再スローする必要があります。

1

catchブロックで処理を実行しておらず、例外を再度スローしただけです。

そこにtry ... catchブロックがあるという点はないので警告します。

また、「スローex」はスタックトレースを保存せず、スローします。

4

これは冗長なためです。

+9

これは冗長なためです。 –

+0

いつから答えが本当の答えですか? – orandov

+7

「冗長なとき」 –

1

それはしばらく注目に値します...

try 
{ 
    DoSomething(); 
} 
catch 
{ 
    throw; 
} 

は...

try 
{ 
    DoSomething(); 
} 
catch (Exception ex) 
{ 
    // Generally a very bad idea! 
    throw ex; 
} 

この2番目のコードスニペットは、私が継承されたコードベースを通じてはびこっていた...次はないが、reduntantですいくつかのプロジェクトが前にあり、元の例外のスタックトレースを隠すという厄介な効果があります。このようにキャッチした例外をスローすると、スタックトレースの先頭がthrowレベルにあり、DoSomethingという言及なしに、またはネストされたメソッド呼び出しが実際に例外を引き起こしたことを意味します。

これを行う幸運のデバッグコード!

+1

R#は、後者が「おそらく意図しない」と警告するように設定できます。 – AakashM

関連する問題