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

时间:2012-10-01 23:16:57

标签: .net assert

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

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

2 个答案:

答案 0 :(得分:4)

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

从MSDN页面的备注部分:

  

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

编辑:回复评论:

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

  

例如,您可以覆盖TraceListener.Fail方法以写入事件日志,而不是显示Assertion Failed对话框。

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

答案 1 :(得分:3)

我认为你有三种选择:

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

  • 另一个选项是Code Contracts。如果不符合合同,则默认抛出RaiseContractFailedEvent。

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