【发布时间】:2010-11-30 20:30:05
【问题描述】:
我已经阅读了大量关于如何以及何时使用断言的articles(以及其他一些类似 发布在 StackOverflow 上的问题),并且我非常了解它们。但是,我仍然不明白什么样的动机应该驱使我使用Debug.Assert 而不是抛出一个普通的异常。我的意思是,在 .NET 中,对失败断言的默认响应是“停止世界”并向用户显示一个消息框。虽然这种行为可以修改,但我觉得它非常烦人和多余
为此,虽然我可以改为抛出一个合适的异常。这样,我可以在抛出异常之前轻松地将错误写入应用程序的日志,而且我的应用程序不一定会冻结。
那么,如果有的话,我为什么要使用Debug.Assert 而不是普通的异常?将断言放在不应该出现的地方可能只会导致各种“不需要的行为”,所以在我看来,通过使用断言而不是抛出异常,我真的没有任何收获。你同意我的观点,还是我在这里遗漏了什么?
注意:我完全理解“理论上”的区别(调试与发布、使用模式等),但在我看来,最好还是抛出异常而不是抛出异常执行断言。因为如果在生产版本中发现错误,我仍然希望“断言”失败(毕竟,“开销”非常小),所以最好还是抛出异常。
编辑:在我看来,如果断言失败,则意味着应用程序进入了某种损坏的意外状态。那么我为什么要继续执行呢?应用程序是在调试版本还是发布版本上运行并不重要。两者都一样
【问题讨论】:
-
对于您所说的“如果在生产版本中发现错误,我仍然希望“断言”会失败”,您应该使用异常
-
性能是唯一的原因。始终对所有内容进行空检查会降低速度,尽管它可能完全不明显。这主要用于不应该发生的情况,例如,您知道您已经在之前的函数中对它进行了空检查,没有必要浪费循环再次检查它。 debug.assert 就像最后一次机会单元测试一样有效地通知您。
标签: c# exception assertions