Answers:
断言仅应用于验证逻辑上不可能为假的条件(请参阅:健全性检查)。这些条件应仅基于您自己的代码生成的输入。基于外部输入的任何检查都应使用异常。
我倾向于遵循的一个简单规则是使用断言来验证私有函数的参数,并对公共/受保护函数的参数使用异常。
断言用于查找编程错误。删除所有断言后,您的程序也必须运行良好。
另一方面,异常是针对即使程序完美的情况也可能发生的情况。它们是由硬件,网络,用户等外部因素引起的。
典型的编程实践是从生产/发布版本中编译出断言。断言仅在内部测试期间有助于发现假设失败。您不应该承担外部机构的行为,因此您不应该对来自网络或用户的事件进行断言。在断言失败的情况下,为生产构建编写处理代码也是一个好习惯。
例如在C中
int printf(const char *fmt, ...)
{
assert(fmt); // may fail in debug build but not in production build
if (!fmt) return -1; // handle gracefully in production build
...
}
异常应该内置到生产版本中。异常的替代方法是返回错误而不是断言。
对于我而言,断言的一个问题是它们在Java中默认为禁用。
我们使用故障优先策略,其中该程序(可能已经无人值守运行了多年)需要尽早崩溃,以避免由于数据损坏(以意外形式)而导致数据损坏。这就是我们用来检查的内容,通过使用断言,我们基本上会冒风险使其不活动。