5

通常、GUI(フォーム)のようなコードの上位レベルで例外をキャッチします。

しかし、私は通常この種のコードを持っています

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

実行時にメッセージが必要ないため、識別子なしでcatch(Exception)を実行できますが、デバッグビルドの場合は、catchステートメントで中断すると便利です。したがって、私は通常、未使用のex変数の多くの警告を防ぐためにConsole.WriteLineを記述します。コードにConsole.WriteLine(ex.Message)のケースがたくさんあります。このコストパフォーマンスは低下しますか?

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

4

6 に答える 6

11

これは1の複数の質問なので、展開してみます。

まず、

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

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

第二に

Console.WriteLineは、診断を行うための適切な方法ではありません。Trace.WriteLineを確認するか、ログフレームワークを確認してください。もちろん、Console.Writelineにはコストがかかり、コストはそれほど深刻ではありませんが、それでも呼び出しが行われ、コストがかかります。

第三に

クラッシュしたほうがよい場合もありますが、根本的な問題を修正する必要があります。本当に悪いことが起こった場合は、少なくともDebug.Assertを実行してください。

于 2009-06-29T02:30:15.463 に答える
7

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

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();

ただし、一般に、例外自体は、コンソールにダンプするよりもパフォーマンスの問題になります。

于 2009-06-29T02:30:54.290 に答える
3

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

于 2009-06-29T02:30:02.763 に答える
2

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

この場合、より良い質問は、出力がwinformsアプリケーションのどこに送られるのか、そしてなぜex.Messageのみを表示し、ex.ToString()を表示しないのかということだと思います。なぜ情報を捨てるのですか?

于 2009-06-29T02:28:21.160 に答える
2

catch ステートメントで "変数 'ex' は宣言されていますが、使用されていません" という警告が表示されないようにし、例外に関連する情報を表示するには、次の手順を実行します。

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

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

于 2010-01-05T21:45:03.110 に答える
0

C# では、例外をキャッチするときに取るに足らないコストがあります。自分でテストして、次のように書きます。

  • 文字列のリストを作成する
  • このリストでは、それらの 25% を数字にし、残りを 1 つの文字にします。
  • 各リストを通過する for ループを実行し、int foo = (int)myList[0] を実行しますが、try/catch でラップします。

レートを 50%、次に 75%、そして 100% に上げます。100% は少し遅くなりますが、それほどではありません。

この特定の例では、実際の答えは代わりに Int32.TryParse を使用することですが、これはペナルティを示しています。

于 2009-06-29T02:32:19.700 に答える