【问题标题】:Make .NET assertion throw an exception in release build使 .NET 断言在发布版本中引发异常
【发布时间】:2012-10-01 23:16:57
【问题描述】:

我们在整个代码中都有一堆 .NET 断言,我们从未见过它们失败。如果由于某种原因断言失败,我们宁愿终止进程并生成故障转储,也不愿破坏用户数据。

我们设置了所有架构,以便在未处理的异常时创建内存转储,因此我们希望我们的断言在发布版本中以这种方式运行。有没有办法巧妙地做到这一点,或者我们只需要将所有的 Assert 调用替换为其他一些断言然后抛出的函数?

【问题讨论】:

    标签: .net assert


    【解决方案1】:

    一种选择是使用Trace.Assert 而不是Debug.Assert。

    来自 MSDN 页面的备注部分:

    如果您想在发布版本中进行断言,请使用 Trace.Assert 方法。 Debug.Assert 方法仅适用于调试版本。

    编辑:回应评论:

    Trace.Assert 存在的原因是提供与Debug.Assert 相同的功能,但在生产版本中。您应该能够使用与 Debug.Assert 上的故障转储相同的基础架构,但您必须引用 Trace 而不是 Debug。来自MSDN文章Assertions in Managed Code

    例如,您可以重写 TraceListener.Fail 方法以写入事件日志,而不是显示“断言失败”对话框。

    在您的情况下,您可能会重用您今天使用的相同TraceListener(可能 - 我不知道,除非您这么说)来生成故障转储。唯一的区别是您将其添加到 Trace.Listeners 而不是 Debug.Listeners

    【讨论】:

    • 谢谢 - 关键是 TraceListener(我之前没有听说过) - 创建我自己的类继承自它,覆盖 Fail 方法来调试中断或转储进程;然后将其添加到Trace.Listeners。我首先在Trace.Listeners 上调用Clear 以删除默认处理程序。
    【解决方案2】:

    在我看来你有三个选择:

    • 将调试版本而不是发布版本部署到您的客户端。如果您希望获得准确的堆栈跟踪,这也是一个更好的选择。这就是调试构建的目的。

    • 另一个选项是Code Contracts。如果不满足合同,默认情况下会引发 RaiseContractFailedEvent。

    • 使用 Guard 实用程序而不是开箱即用的 Assert 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 2019-01-03
      • 1970-01-01
      • 2014-06-13
      • 2019-01-28
      • 2012-04-07
      相关资源
      最近更新 更多