我与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
     }
}


现在我的问题是:有人看到这种方法有问题吗?

最佳答案

我会说Trace.Assert中的异常是一个坏主意(不查看您的代码)。

Trace.XXXX方法通常用于跟踪内容。对于将来的读者(包括您)来说,了解Trace.Assert实际上会引发异常将是非常令人惊讶的。

看到Trace.Assert(甚至是Fail)引发异常甚至更加令人惊讶。声明的目的是帮助提前发现问题,而不是终止应用程序。

我建议您提出一个自定义方法,以其名称清楚地显示其行为,而不要提出现有方法的意外行为。

关于c# - 一个TraceListener,在失败的断言上引发异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15146950/

10-12 19:18