如何防止Debug.Assert(...)显示模式对话框

Mar*_*tin 29 .net c# assert c#-4.0

我有几个使用的库Debug.Assert(...).我认为这Debug.Assert(...)很好,我仍然希望它们执行,但我不希望它们阻止我的应用程序的执行.理想情况下,我只希望他们在某处登录.

鉴于我无法更改库的代码(我仍然希望在调试中编译并运行断言),如何阻止Debug.Assert(...)显示模式对话框?

另外,我想确保主程序在Assert发生时继续(与忽略按钮相同的行为).

谢谢!

Dea*_*ing 29

我不推荐它.问题是Debug.Assert只有当你的代码中有bug时才会被触发.如果您只是忽略它们或者不修复它们,那么您的用户就会受到损害.另一方面,如果你正在Debug.Assert解决那些不是 bug的问题,那么你也会对你的用户造成伤害(通过减少Debug.Assert的影响).

话虽如此,你可以禁用它.您需要做的第一件事是从Debug.Listeners集合中删除默认侦听器:

Debug.Listeners.Clear();
Run Code Online (Sandbox Code Playgroud)

然后,添加您自己的:

Debug.Listeners.Add(new MyTraceListener());
Run Code Online (Sandbox Code Playgroud)

您需要创建一个继承自TraceListener的类:

class MyTraceListener : TraceListener
{
    // ...

    public override void Fail(string msg, string detailedMsg)
    {
        // log the message (don't display a MessageBox)
    }
}
Run Code Online (Sandbox Code Playgroud)

TraceListener.Fail方法的重要方法是在实现中DefaultTraceListener显示消息框的方法.

  • @Martin断言点是在有bug的时候触发.如果断言被触发,则执行应该停止,因为结果是不可预测的.你试图滥用断言,应该坚持自己的记录器. (4认同)
  • 我们有一个场景,其中有大量遗留代码库,其中散布着正确和错误使用的断言。当你想调试你的特定代码段时,你必须通过有时 100 条断言来争取你的代码。我们正在慢慢清理断言,但在我们的情况下,部分禁用断言是一个有效的临时修复,因此这是一个有价值的答案 (2认同)

Jul*_*ian 24

没有必要 Debug.Listeners.Clear()

只需添加到.config:

<system.diagnostics>
    <assert assertuienabled="false"/>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud)


Mat*_*lis 5

Codekas的答案是正确的,如果你想用一把非常大的锤子击打东西.您可以使用<assert>应用程序配置文件中的元素将assertuienabled属性设置为false,并可选择为要写入的Asserts提供日志文件.那么你就不必编写自己的监听器了.

您可以在MSDN页面上阅读有关assert元素的更多信息.

  • @ChristianSt。您假设首先正确使用了断言,或者您关心其他所有人的断言。如果您只想在应用程序中滑动直到遇到自己的断点怎么办 (2认同)