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

3
我们的代码中有很多.NET断言,但我们从未看到失败。如果某个断言确实失败了,我们宁愿终止进程并生成崩溃转储,也不愿意破坏用户的数据。
我们已经设置好了所有体系结构以在未处理的异常时创建内存转储,因此我们希望在发布版本中,我们的断言行为与此类似。是否有一种简洁的方法来实现这一点,或者我们只需要用其他函数替换所有的Assert调用来进行断言并抛出异常?
2个回答

4
一种选择是使用 Trace.Assert 而不是 Debug.Assert。
来自 MSDN 页面的 Remarks 部分:
使用 Trace.Assert 方法可在发布版本中进行断言。Debug.Assert 方法仅适用于调试版本。
编辑:针对评论的回复:
Trace.Assert 的存在是为了在生产版本中提供与 Debug.Assert 相同的功能性。您应该能够在 Debug.Assert 上使用崩溃转储所使用的相同基础架构,但您需要引用 Trace 而不是 Debug。来自 MSDN 文章 Assertions in Managed Code
例如,您可以重写 TraceListener.Fail 方法以将内容写入事件日志而不是显示“断言失败”对话框。
在您的情况下,您可能可以重复使用相同的 TraceListener,这取决于您今天是否正在使用它来生成崩溃转储(我不确定除非您明确说明)。唯一的区别是,您将其添加到 Trace.Listeners 而不是 Debug.Listeners

3
谢谢 - 关键是 TraceListener(之前我没听说过)- 我创建了一个继承自它的类,重写了 Fail 方法,使其要么进行调试中断,要么倾倒(process dump)进程;然后将其添加到 Trace.Listeners 中。我首先在 Trace.Listeners 上调用了 Clear 方法,以删除默认处理程序。 - Smashery

3
我认为你有三个选项:
  • 将调试版本部署给客户,而不是发布版本。如果你想获得准确的堆栈跟踪,这也是一个更好的选择。调试版本就是为此而设计的。

  • 另一个选择是使用代码契约。如果未满足合同,则默认会抛出RaiseContractFailedEvent。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接