首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TraceListener,它在失败的断言上抛出异常。

TraceListener,它在失败的断言上抛出异常。
EN

Stack Overflow用户
提问于 2013-02-28 22:31:21
回答 2查看 1.6K关注 0票数 2

DefaultTraceListener (它是唯一的跟踪侦听器,如果不是在app.config中重写)的问题是,如果AssertUiEnabledfalse (即在ASP.NET中),它会在失败的断言(对Trace.Assert(false)的调用)上以OutputDebugString的形式写入消息,但是继续执行。

所以我使用了下面的TraceListener子类,它会抛出一个异常。我用

代码语言:javascript
复制
TraceListenerWhichThrowsExceptionOnFail.InsertAsFirstTraceListener(Trace.Listeners);

Application_Init中。

现在,在Application_Error事件中,我可以用完整的堆栈跟踪记录异常(作为任何异常),包括调用Trace.Assert(false)

代码语言:javascript
复制
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
     }
}

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

EN

回答 2

Stack Overflow用户

发布于 2013-02-28 22:53:56

我认为Trace.Assert中的异常是个坏主意(不看代码)。

通常用于跟踪内容的Trace.XXXX方法。对于未来的读者(包括您)来说,知道Trace.Assert实际上抛出异常是非常令人惊讶的。

看到Trace.Assert (甚至失败)抛出异常更加令人惊讶。断言的目的是帮助预先识别问题,而不是扼杀应用程序。

我建议您的自定义方法在名称中清楚地显示其行为,而不是出现现有方法的意外行为。

票数 0
EN

Stack Overflow用户

发布于 2013-03-02 07:30:41

在Fail()中抛出异常可能导致: 1.调用堆栈将引起混淆,因为异常不会在条件失败的附近抛出。

通常,您应该在条件失败的地方抛出异常。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15146950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档