在我们的代码中,我们有一堆 .NET 断言,我们从未见过它们失败。如果由于某种原因断言确实失败了,我们宁愿终止进程并生成故障转储,也不愿破坏用户的数据。
我们已经设置了所有架构来在未处理的异常时创建内存转储,因此我们希望我们的断言在发布版本中以这种方式运行。有没有办法巧妙地做到这一点,或者我们只需要用Assert
其他一些断言然后抛出的函数替换我们所有的调用?
一种选择是使用Trace.Assert而不是 Debug.Assert。
从 MSDN 页面的备注部分:
如果您想在发布版本中进行断言,请使用 Trace.Assert 方法。Debug.Assert 方法仅适用于调试版本。
编辑:回应评论:
存在的原因是提供与生产版本Trace.Assert
相同的功能。Debug.Assert
您应该能够使用与 Debug.Assert 上的故障转储相同的基础架构,但您必须引用 Trace 而不是 Debug。来自 MSDN 文章托管代码中的断言:
例如,您可以重写 TraceListener.Fail 方法以写入事件日志,而不是显示 Assertion Failed 对话框。
在您的情况下,您可能会重用TraceListener
您今天使用的相同内容(可能-除非您这么说,否则我不知道)来生成故障转储。唯一的区别是您将其添加到Trace.Listeners而不是Debug.Listeners。
在我看来,你有三个选择:
将调试版本而不是发布版本部署到您的客户端。如果您希望获得准确的堆栈跟踪,这也是一个更好的选择。这就是调试构建的目的。
另一种选择是代码合同。如果不满足合同,默认情况下会引发 RaiseContractFailedEvent。
使用 Guard 实用程序而不是开箱即用的 Assert 函数。