2

私の問題DefaultTraceListener(app.configでオーバーライドされていない場合、これは唯一のトレースリスナーです)は、AssertUiEnabledfalseつまりASP.NETで)OutputDebugString失敗したアサーション(への呼び出しTrace.Assert(false))のようにメッセージを書き込みますが、実行を継続します。

TraceListenerそのため、代わりに例外をスローするの次のサブクラスを使用しています。を使用してアクティブ化します

TraceListenerWhichThrowsExceptionOnFail.InsertAsFirstTraceListener(Trace.Listeners);

Application_Init

これで、Application_Errorイベントでは、Trace.Assert(false).

public class TraceListenerWhichThrowsExceptionOnFail : TraceListener
{
    public static void InsertAsFirstTraceListener(TraceListenerCollection traceListeners)
    {
        traceListeners.Insert(0, new TraceListenerWhichThrowsExceptionOnFail());
    }

    public override void Fail(string message, string detailMessage)
    {
        message = string.IsNullOrEmpty(detailMessage) ? message : message + ", Detail message: " + detailMessage;

        throw new ApplicationException("Trace assertion failed" + 
            (string.IsNullOrEmpty(message) ? "" : ": " + message) + ".");
    }

     public override void Write(string message)
     {
        // NOP
     }

     public override void WriteLine(string message)
     {
        // NOP
     }
}

今私の質問:このアプローチに問題がある人はいますか?

4

3 に答える 3

0

Trace.Assert の例外は悪い考えだと思います (コードを見ていない)。

通常、ものをトレースするために使用される Trace.XXXX メソッド。Trace.Assertが実際に例外をスローすることを知ると、将来の読者 (あなたを含む) は非常に驚くでしょう。

Trace.Assert (または Fail) が例外をスローするのを見るのはさらに驚くべきことです。Assert の目的は、アプリケーションを強制終了することではなく、事前に問題を特定することです。

既存のメソッドの予期しない動作を考え出すのではなく、名前でその動作を明確に示すカスタム メソッドを考え出すことをお勧めします。

于 2013-02-28T22:53:56.773 に答える
0

場合によります。

これが ASP.NET シナリオで役立つかどうかはわかりません。デバッグ中に、アサーションが正常に動作するようにします。例外をスローすると、おそらく少し混乱するでしょう。また、実稼働環境では、リリース ビルドを使用して、Trace.Assertステートメントがとにかく何もしないようにします。

ただし、単体テストには同様の手法を使用します。「Assertion Failed」というメッセージ ボックスを表示してビルド サーバーを停止させたくはありません。代わりに、アサーションによってテストが失敗するようにします。そのため、単体テスト (およびホースのみ) には App.config ファイルを使用します。これにより、類似したトレース リスナーがインストールされます。

于 2013-02-28T23:08:38.367 に答える
-1

Fail() で例外をスローすると、次のことが発生する可能性があります。 1. 条件が失敗した場所の近くで例外がスローされないため、コール スタックが混乱します。

通常、条件が失敗した場所の近くで例外をスローする必要があります。

于 2013-03-02T07:30:41.347 に答える