断言用于检查是否满足条件(前置条件,后置条件,不变量),并帮助程序员在调试阶段找到漏洞.
例如,
void f(int *p)
{
assert(p);
p->do();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我们是否需要假设在发布模式下无法满足条件并相应处理案例?
void f(int *p)
{
assert(p);
if (p)
{
p->do();
}
}
Run Code Online (Sandbox Code Playgroud)
毕竟,断言意味着它所测试的条件永远不应该是假的.但是,如果我们不检查它并且它失败了,程序崩溃了.听起来像是两难.你们怎么处理它?
use*_*996 21
如果断言失败,程序应该崩溃.
断言失败意味着程序员在理解程序流程如何进行时犯了一个根本性的错误.这是一种发展援助,而不是生产援助.在生产中,人们可能会处理异常,因为它们"可能"发生,而断言应该"永不"失败.
如果你在营地里说:"哦,但如果断言在生产中失败怎么办?我需要抓住它们!" 那你就错过了这一点.在这种情况下,问问自己,为什么不只是抛出异常(或以其他方式处理错误)?
一般来说,声称是不是只是一个速记"如果条件不满足,抛出异常"(当然,有时这是操作语义,但它不是指称语义).相反,断言失败意味着应用程序处于开发人员认为不可能的状态.你真的希望代码在这种情况下继续执行吗?显然(我会说),不.