我与DefaultTraceListener
(这是唯一的跟踪侦听器,如果未在app.config中覆盖)的问题是,如果AssertUiEnabled
是false
(即在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/