3

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

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

4

2 回答 2

4

一种选择是使用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

于 2012-10-01T23:18:17.537 回答
3

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

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

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

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

于 2012-10-01T23:24:08.580 回答