12 August 2023

C++ 核心指南目录

“If you can’t throw exceptions, consider failing fast”

理由

如果无法很好的进行出错恢复,那么,至少在没有造成太大损失之前,早早结束。

注意

如果你无法系统化地处理出错情况,对于无法局部处理的错误,考虑直接让程序“崩溃”。也就是说,如果在函数检测到错误的时候,无法从错误中恢复回来,可以调用 abort()quick_exit() 等类似的函数触发系统重启。

如果,在系统中,你有很多进程,或者很多计算机,你有预见,将来会需要处理很多严重的系统崩溃情况。比如说,硬件出错。这些情况,崩溃只是意味着某个错误需要上一层的计算系统来处理罢了。

例子

void f(int n)
{
    // ...
    p = static_cast<X*>(malloc(n * sizeof(X)));
    if (!p) abort();     // abort if memory is exhausted
    // ...
}

很多程序无法优雅的处理内存耗尽的情况。此例子大概等价于下面这个例子:

void f(int n)
{
    // ...
    p = new X[n];    // throw if memory is exhausted (by default, terminate)
    // ...
}

典型的来说,最好在“崩溃”之前记录一条日志,表明崩溃的原因。