2009-06-29 9 views
3

通常、GUI(フォーム)のようなコードの上位レベルで例外を検出します。警告メッセージを防ぐためにConsole.WriteLine(ex.Message)を呼び出す

しかし、私は通常、コード

try 
{ 
} 
catch(Exception ex) 
{ 
    Console.WriteLine(ex.Message); 
    MessageBox.Show("Application has encountered error...."); 
} 

のこの種を持っている私は、実行時にメッセージを必要としないので、私はちょうど識別子なし(例外)をキャッチすることができますが、デバッグビルドのために、それは確かに便利です。 catch文で中断してください。ですから、私は通常、未使用のex変数の警告を防ぐためにConsole.WriteLineを記述します。私は自分のコードでConsole.WriteLine(ex.Message)のケースをたくさん持っています。このコストパフォーマンスは低下しますか?

注:「Console.WriteLine(ex.Message)にはパフォーマンスコストがありますか」というタイトルが変更されました。 「警告するメッセージを防ぐためにConsole.WriteLine(ex.Message)を呼び出す」に

答えて

10

これはので、私はそれをアンロールしようとする1内に複数の質問です:

まず

try{ 
    ... 
} 
catch(Exception) 
{ 
} 

は完全に有効な構文です。警告なしにコンパイルするためにConsole.WriteLine(ex.Message)を追加するだけでは正しいことではありません。

第二

ます。Console.WriteLineは、診断を行うより良いまだLogging framework Trace.WriteLineを見たりする適切な方法ではありません。もちろん、Console.Writelineにはコストがかかりますが、コストはそれほど深刻ではありませんが、通話が行われ、コストがかかります。

第三

クラッシュすることが時々その良いことに、それは本当に悪い何かが起これば、少なくともDebug.Assertを行い、根本的な問題を解決するためにあなたを強制します。

2

すべてはパフォーマンスコストがあります。問題は、パフォーマンスコストが重要かどうかです。

この場合、より良い質問は、出力がwinformsアプリケーションで行われる場所と、なぜex.TMessageとex.ToString()が表示されないのかということです。なぜ情報を捨てるのか?

+0

正確には私が考えていたもの –

+0

MessageBox.Show(ex.ToString())は、エラーが発生したことをユーザーに知らせるための貧弱な方法です。このメッセージは多くの場合、1画面分以上の情報を取り上げ、OKボタンは表示されません。例外はログに記録する必要がありますが、実際にはすべてユーザーに表示されるべきではありません。 –

+0

trueですが、MessageBox.Show(ex.ToString())は推奨されていません。 – Fantius

3

より良い選択は、System.Diagnostics.Debug.WriteLine(ex)またはSystem.Diagnostics.Trace.WriteLine(ex)です。デバッグは、DEBUGシンボルが定義されており、TRACEがTRACEが定義されている場合にのみ何かを行います。デフォルトでは、リリースビルドにDEBUGシンボルは含まれません。

6

デバッグモードで除外される拡張メソッドを作成できます。

public static Exception 
{ 

    [Conditional("DEBUG")] 
    public static void Dump(this Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
    } 
} 

あるいはさらに良い...

public static Exception 
{ 
    public static void Log(this Exception ex) 
    { 
#if DEBUG 
     Console.WriteLine(ex.ToString()); 
#endif 
     Logger.WriteLine(ex.ToString()); 
    } 
} 

次に、あなたのコード内でConsole.WriteLine(ex.ToString())

ex.Log();にを置き換えるしかし、一般的に例外自体はにダンプするよりもパフォーマンスの問題をよりになりますコンソール。

+0

うわー、とてもいいです - 私はこれについて知らなかった。 +1。 –

0

C#では、例外をキャッチするときに重要ではないコストがあります。

  • 数と残りの一文字それらの25%を作る、このリスト内の文字列
  • のリストを作成します。自分のため テストそれを、このような何かを書きます。
  • 各リストを通り、int foo =(int)myList [0]を実行するforループを実行しますが、try/catchでラップします。

レートを50%、75%、100%にバンプアップします。 100%はやや遅くなりますが、あまり大きくはありません。

実際の答えはInt32.TryParseを代わりに使用することですが、これはペナルティを示しています。次の操作を行い、例外に関連する情報を参照することも、「変数 『EX』宣言されていないが、決して使用されている」catchステートメントでは、と :

try 
{ 
    ... 
} 
catch(Exception) // avoid warning 
{ 
    // set break point inside exception 
} 

警告が入らないようにするに

2

例外内にブレークポイントを設定し、デバッガ変数$ exceptionを クイックウォッチウィンドウ、ローカルウィンドウ、またはVisual Studio(2008)内のウォッチウィンドウで確認します。

+0

+1私は$例外について知らなかった。それは本当に知っていると便利です。 – Brian

関連する問題