【发布时间】:2012-11-10 05:38:33
【问题描述】:
我经常在我们的代码库中看到一种结构,即程序以某种方式进入无效状态,代码会故意做错事,只是为了强制崩溃。它通常是这样的:
if(<something is wrong>)
{
int *ptr = NULL;
*ptr = 0;
}
这当然会导致空引用异常并以不可恢复的方式使程序崩溃。我只是想知道这是否真的是最好的方法?首先,它读起来不好。如果没有评论,您可能不会意识到这里发生的崩溃是故意的。其次,几乎没有办法从中恢复。它不会抛出异常,因此无法由其他代码处理。它只是杀死程序而无法回溯。它也没有提供太多关于为什么它必须在这里崩溃的线索。它会在所有构建中崩溃,不像断言。 (我们确实有一个非常强大的断言系统可用,但它并不总是在这种情况下使用。)
这是我们到处都在使用的风格,否则我无法说服任何人。我只是好奇这在行业中有多普遍。
【问题讨论】:
-
为什么不直接使用
abort()? -
assert( !(<something is wrong>) ); -
我怀疑原程序员的意图是导致程序在生产环境中运行时“不可恢复地”失败,或者导致调试器中断(如果一个存在)。我不喜欢这种结构,但我看到人们认为这是实现这种效果的唯一“可靠”跨平台方式。我个人不会使用它。
-
这太可怕了。如果您知道程序出错但不确定原因,您应该转储您认为有助于解决问题的所有内容。在没有任何线索的情况下使程序崩溃是牛仔编程恕我直言......
-
C++ 中不存在“空引用异常”。
标签: c++ coding-style crash assert