我们的代码中有一堆.NET断言,我们从未看到过失败。如果由于某种原因断言确实失败了,我们宁愿终止进程并生成崩溃转储而不是破坏用户的数据。
我们已经设置了所有架构来在未处理的异常上创建内存转储,因此我们希望我们的断言在发布版本中以这种方式运行。有没有办法做到这一点整齐,或者我们只需要用断言然后抛出的其他函数替换所有Assert
调用?
答案 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函数。