在哪里放置断言?

时间:2011-01-31 07:17:25

标签: c++ production-environment

对意外情况的断言被认为是良好的防御性编码实践。每当我认为可能发生意想不到的事情时,我碰巧就会发出断言,但现在看来这对我来说太过分了。

此外,有时温和的意外情况不一定会导致崩溃甚至可能导致客户端失败。

判断断言是否有严格的规则?

感谢。

5 个答案:

答案 0 :(得分:6)

何时使用断言和例外之间的主要区别:

  • 使用断言来捕获编程错误。如果代码写得正确,就不应该断言。

  • 使用例外来捕获由意外环境引起的运行时错误。

  • 如果您的程序从文件中读取脚本或内容并且它们与预期的格式不匹配,我认为这是一个运行时条件,因此是一个例外。

出于调试目的,您可以决定在抛出异常的地方使用断言,只是为了能够在抛出异常的地方更容易地解决,尽管您可以使用插入 FILE <的异常宏/ strong>和 LINE 也可以在邮件中执行此操作。

答案 1 :(得分:5)

  

在哪里放置断言?

经常被忽视的是断言也可以作为文档辅助工具。

因此,不仅要测试'意外',还要使用它们来表达代码中关键点的假设(不变量)。与assert(high >= low)

一样

当然,正如其他人在此指出的那样,这些都是有条件的。

答案 2 :(得分:2)

没有没有......但我肯定会建议在测试和制作中对断言进行不同的处理。

在测试环境中生成核心转储是完全可以的。它允许通过保持整个程序状态的安全性来轻松检查触发断言的条件。

但是在生产环境中,您永远不想崩溃(除非内存损坏......)。用户期望系统始终响应,没有什么比请求某些东西并且从未收到响应更令人恼火。因此,您的工作是确保用户获得更有意义的响应,即使它是错误消息。实现这一目标的最简单方法通常是抛出异常。

答案 3 :(得分:0)

当您在进入下一级代码之前确定某些条件必须为真时,会发出断言。例如,当窗口句柄无效或某些变量没有有效值时。

答案 4 :(得分:0)

从声音中,您可以在发布版本中启用它们。如果是这样,创建断言级别 - 将在某些构建中启用或禁用的断言级别。然后只使用一个断言级别。

通过这种方式,您无需为了开发和调试版本或测试版本而关闭,关闭或删除它们。

我通常在发布时禁用它们,但它们确实消耗了大量的代码。我不认为这很糟糕 - 它可以作为文档并强制执行按预期使用的界面。我认为拥有许多开发人员可能会考虑太多断言是很好的,但是在大图中确实没有太多因为代码库的发展,这确保了程序总是按预期使用。因此,我不建议删除它们,只需禁用发布版本的非致命检查。

最终,有更好的方法而不是水平(参见下面的讨论并从别人的回答中得到你想要的东西) - 但是水平是引入变化而不会显着影响现有程序的一种简单方法。这对于过渡到另一个错误处理方案是一个很好的方法,或者如果你对你已经拥有的东西感到高兴了98%。