【问题标题】:How to prevent Debug.Assert(...) to show a modal dialog如何防止 Debug.Assert(...) 显示模式对话框
【发布时间】:2010-05-18 01:14:53
【问题描述】:

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

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

此外,我想确保主程序在出现Assert 时继续运行(与忽略按钮的行为相同)。

谢谢!

【问题讨论】:

  • 有趣的是这里没有人提到它,但是Debug.Assert() 不会出现在你编译的应用程序中(当你在发布模式下部署它时)。这严格来说是一个调试工具,不会影响最终用户。但如前所述,如果您不修复断言,您的应用程序中可能会发生不好的事情。

标签: c# .net visual-studio c#-4.0 assert


【解决方案1】:

我不会推荐它。问题是Debug.Assert 应该只在您的代码中有错误时触发。如果您只是忽略它们或不修复它们,那么您就是在伤害您的用户。另一方面,如果您为不是错误的事情开除Debug.Assert,那么您也是在伤害您的用户(通过减少Debug.Assert 的影响)。

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

Debug.Listeners.Clear();

然后,添加您自己的:

Debug.Listeners.Add(new MyTraceListener());

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

class MyTraceListener : TraceListener
{
    // ...

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

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

【讨论】:

  • 这很好用,但是当断言失败时,代码不会继续运行。我希望它继续下去。知道我该怎么做吗?
  • @Martin 断言的重点是在有错误时触发。如果一个断言被触发,执行应该停止,因为结果是不可预测的。您正在尝试滥用断言,应该坚持使用自己的记录器。
  • 我们有一个场景,其中存在大量遗留代码库,其中充斥着正确和错误使用的断言。当您想要调试您的特定代码时,您有时必须通过 100 多个断言来获得您的代码。我们正在慢慢清理断言,但在我们的例子中,部分禁用断言是一个有效的临时修复,所以这是一个有价值的答案
  • 也许 OP 想要一个仅在调试中触发并且不会打开烦人的 GUI 窗口而只是让应用程序处理异常/日志记录的断言?
【解决方案2】:

不需要Debug.Listeners.Clear()

只需添加到您的 .config

<system.diagnostics>
    <assert assertuienabled="false"/>
</system.diagnostics>

【讨论】:

  • 这对我有帮助。我们希望在某些工具中进行调试插入,而不是在其他使用相同共享 dll 的工具中插入。完美,只需更改应用配置。
【解决方案3】:

Codekas 的答案是正确的,如果您想用非常大的锤子敲击东西。您可以使用应用程序配置文件中的&lt;assert&gt; 元素将assertuienabled 属性设置为false,并可选择为要写入的Asserts 提供一个日志文件。这样您就不必编写自己的侦听器了。

您可以在其MSDN page 上阅读有关 assert 元素的更多信息。

【讨论】:

  • 这很好用,但是当断言失败时,代码不会继续运行。我希望它继续下去。知道我该怎么做吗?
  • @Martin 很老的话题,但是如果代码中有错误,为什么还要继续?我的意思是,您对错误结果的期望是什么,因为您的任何假设都是错误的?
  • @ChristianSt.您假设断言首先被正确使用,或者您关心其他所有人的断言。如果您只想滑过应用程序直到遇到自己的断点,该怎么办
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 2017-10-25
  • 2020-10-28
  • 1970-01-01
相关资源
最近更新 更多