2012-08-15 16 views
9

私の質問への回答を検索しましたが、見つけられませんでした。答えがあり、私は複製している場合はお詫び!例外の使用を行わない単純なtry/catch

私は警告の元になります

try 
{ 
    //Do whatever 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

が使用されることはありません、このような.....としてのtry/catchコードを見てください。

私の質問は... exは決して使用されていませんが、宣言に何か利点がありますか?多分、スタックトレースに詳細を追加すると言われましたか?時々私は警告を止めるキャッチ(例外)を見ますが、もしあれば何のメリットがありますか?

try 
{ 
    //Do whatever 
} 
catch 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

...私は元を宣言しませんどのような方法で例外を使用し、これを書いていないことだったそうでない場合は、大きな問題ではなく、確かに知ってもいいでしょう!

おかげ

フレッド

+0

あなたはおそらく、あなたがそれをユーザーに表示しない場合でも、あなたが後でそれをデバッグできるように、ログに実際の例外を書きたいです。 – Rup

+0

はい、あなたがいくつかの 'catch'esを持つことができるので例外 – bizl

+0

を宣言しないと何がうまくいかなかったかに興味がないなら、' catch(BadFormatException){/ * bad formatここで* /} catch(例外ex){/ *ここで不明なエラー* /} '私はそれが 'catch(Exception)'を使用する理由だと思う。 – Default

答えて

10

あなたは(SEH)構造化例外処理を確保するために、変数せずに、まだ特定の例外の型を宣言し、次のパターンを使用することができますが、まだ起きている:

try 
{ 
    //Do whatever 
} 
catch (IOException) 
{ 
    MessageBox.Show("Oops, something went wrong in the IO!"); 
} 
catch (Exception) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

これは私が通常使っている方法ではありませんが、例外の詳細を記録し直すことはできません。

+0

私はこれを見つけ出すまで、あなたが変数(例えば "IOException ex")にそれを割り当てなくても、例外をキャッチすることはできませんでした。ありがとうございました! –

1

あなたが使用できるよう後で使用する、などのロギング、メッセージングなどのためex変数

try 
{ 
    //Do whatever 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 

} 

あなたは、あなたの例外をログに記録したいとしているので、後で開発ログを見て何がうまくいかないかを判断できます。その場合、exはログに必要なすべての詳細を保持します。例えばStackTrace、メッセージ、のInnerExceptionもしあれば等のご質問については、

EXが使用されることはありませんが、宣言のいずれかの利点がありますか?

使用しない場合は、宣言すると効果がありません。

スタックトレースに詳細が追加されている可能性がありますか?

わかりませんが、私はそうではないと思います。定義した場合は、例外のスタックトレースが含まれますが、何も追加されません。

警告を止めるcatch(例外)が表示されることがありますが、何かがある場合は、 のメリットはありますか?

あなたがthrowキーワードを使用して例外をスロー再したい場合は、catch(Exception)

+0

申し訳ありませんが、おそらく私は言っていたはずです。私はあなたが宣言とあなたが捕まえることができるexceoptionsの異なるタイプを持っていた理由を理解しています。私が知らないことは、あなたがそれを使用しない場合、宣言に何らかの利益があるかどうかです。私には無意味だと思うが、私は行方不明のものがあるのだろうか? – Fred

0

を使用することができません、何のポイントは、あなたが実際にそれを使用しない限り、それを宣言するにはありません。

3

通常、例外を抑制するのは悪いフォームです...スタックを上に移動させます。

「の詳細を追加」については、スタックトレースを維持するためにthrowを使用して例外を再スローそうでなければ、詳細を失うことになります。もう一度、代替案はそれをまったくキャッチしないことです。例外(リカバリ、アンワインドなど)を使用していない場合は、それをキャッチする正当な理由はありません。

参照:またWhat is the proper way to re-throw an exception in C#?

参照:"Back to Basics - Exceptions"

3

それはあなたの2つの掲載のコードブロックに差があることに注意することが重要です。 catch (Exception ex)は、CLR定義の例外(Exceptionから派生した例外)をキャッチします。 catchだけでは、CLRがキャッチまたはラップしていないアンマネージ例外も含めて、すべてをキャッチします。

あなたは、コードの動作を変更することなく、あなたのコンパイラの警告を避けたい、またはあなたはまだ特定の例外タイプをキャッチしながら警告を回避したい場合は、代わりにこれを使用することができた場合:

catch (Exception) 
{ 
} 

例えば、catch (SqlException)のように指定することができます。変数を使用していない場合は、警告を宣言しますが、型固有の動作は依然として有効です。

例外を宣言しても、明示的に例外をラップしたり再スローしたりしない限り、情報に何も追加されません(スタックトレースなど)。 (この失う情報を行うためなお、再スローするthrow exを使用しません:。ちょうどthrowを使用)

1

あなたが本当に例外を除いて何かをしたくない場合は、回避するために、そのように行うことができますコンパイラの警告:

catch (Exception) 
{ 
    // Stick our head in the sand 
} 

or just catch

1

これは、すべての開発者と、後期に適切なログ/デバッグ機能を実装するために彼の能力についてです...

この:

catch (Exception ex) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

が簡単

に変換することができ
catch (Exception ex) 
{ 
    Log.Append(ex); 
    MessageBox.Show("Oops, something went wrong. Please check the Log file."); 
} 

場合によってはのデバッグ用にを1行ずつ実行すると、にブレークポイントを設定することができます210行を読み込み、ex変数を読んでください。

それはログをあなたは、あなたは変数exが宣言していない使用されていることを警告を取得しますそれを使用していないので、あなたはすべてのそれらを追跡することができますし、枯れた場合、それは、コンパイル時に、有用だが、持っていますそれを削除するか、削除します。

もう一度、それはプログラマーの選択に関するもので、未使用変数はエンディングプログラムでは問題になりません。

0

実行時例外オブジェクトへの参照となるException exは、複数の利点を与えることができます。開発者として自分自身でテキストファイルに記録したり、自分自身にレポートを送信することができます。 MSDNのドキュメントのよう

あなたが現在 パラメータなしのcatch節で扱う例外を再スローするようにしたい場合は、 引数なしでthrowステートメントを使用します。

http://msdn.microsoft.com/en-us/library/0yd65esw%28v=vs.80%29.aspx

関連する問題