使.NET断言在发布版本中引发异常



我们的代码中有一堆.NET断言,这些断言从未失败。如果由于某种原因断言失败,我们宁愿终止进程并生成崩溃转储,也不愿破坏用户的数据。

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

一个选项是使用Trace.Assert而不是Debug.Assert.

来自MSDN页面的备注部分:

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

编辑:回应评论:

Trace.Assert之所以存在,是为了在生产构建中提供与Debug.Assert相同的功能。您应该能够使用与Debug.Assert上用于崩溃转储的基础结构相同的基础结构,但必须引用Trace而不是Debug。来自MSDN文章《托管代码中的断言:》

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

在您的情况下,您可能会重用您现在使用的TraceListener(可能-除非您这么说,否则我不知道)来生成崩溃转储。唯一的区别是你会把它添加到Trace.Listeners而不是Debug.Listeners.

在我看来,你有三个选择:

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

  • 另一种选择是代码合同。如果未满足约定,则默认情况下会引发RaiseContractFailedEvent。

  • 使用Guard实用程序,而不是现成的Assert函数。

最新更新