我想实现此行为:如何使健壮的断言?
- 当程序在调试模式下运行,
assert_robust(expression, commands)
工作严格喜欢古典assert(expression)
- 当程序在发布模式下运行,
assert_robust(expression, commands)
执行一些commands
如果表达式为假
这是可以做到这样:
#ifdef NDEBUG
#define assert_robust(expression, command) if (!(expression)) command;
#else
#define assert_robust(expression, command) assert(expression);
#endif
这可以用于例如这样做myfunction
容错:
char myfunction(const string& s, int i)
{
assert_robust(i >= 0, return '\0');
/* Normal code */
}
这项工作做得很好,但如何让支持的命令不止一个(任意)号宏assert_robust
? (最好用标准C++的方式)
而另一个问题是:
是它是在调试严格和善意的释放好事吗?
编辑:我的想法,为什么做这样的事情是因为,如果它是在程序,该程序有时比保持崩溃时和用户丢失其数据有点怪异的错误practicaly好得多。
这听起来很像尝试使用assert进行错误处理...(这不是一个好主意TM) – Xarn
@ Xarn:你能解释为什么它不是个好主意吗? – user3123061
断言通常意味着程序员可以使用它来检查自己的工作,其中错误处理(返回码,异常,errno)旨在提供对公共API的检查。 (断言基本上证明了你认为的逻辑上不可能的执行状态,因此你不应该将它们绊倒。例外情况说明别人搞砸了。) – Xarn