我在代码库中经常看到一个构造,程序以某种方式进入无效状态,代码会故意做错,只是为了强制崩溃。它通常是这样的:
if(<something is wrong>)
{
int *ptr = NULL;
*ptr = 0;
}
这当然会导致空引用异常并以不可恢复的方式崩溃程序。我只是想知道这是否真的是最好的方法呢?首先,它读得不好。如果没有评论,您可能没有意识到此处发生的崩溃是有意的。其次,几乎没有办法从中恢复。它不会抛出异常,因此其他代码无法处理它。它只会使程序死亡,无法回溯。它也没有提供很多关于为什么它必须在这里崩溃的线索。它会在所有版本中崩溃,不像断言。 (我们确实有一个非常强大的断言系统,但并不总是在这种情况下使用。)
这是我们在整个地方使用的风格,我无法试图说服任何人。我只是好奇这个行业有多么普遍。
答案 0 :(得分:4)
你不能以故意的方式“崩溃”程序,因为根据它的定义,崩溃就是当程序错误并且无法确定性行为时。
终止执行的标准方法是std::terminate
;通常的方法是调用std::abort
,它会针对进程引发一个不可阻塞的信号(自动导致std::terminate
)并导致许多操作系统产生核心转储。
答案 1 :(得分:2)
你应该抛出一个异常,它基本上会以一种受控的方式故意导致崩溃。以下是this question的帮助示例。
throw string("something_went_wrong");
更好的是,错误被捕获或修复。断言也是一个不错的选择。
答案 2 :(得分:1)
我想这是在你没有调试的情况下触发核心转储的方法。核心转储然后为您提供足够的信息来分析问题。在“程序员错误”(或错误)的情况下,这比抛出异常更好,因为堆栈展开不允许您构建合理的核心转储。通过调用先前已注册(使用std :: set_terminate)生成核心转储或类似内容的函数的std :: terminate,可以以更优雅的方式实现类似的效果。有关详细说明,请参阅this article。