是否可以引入 noreturn noexcept 函数而不是调用 std::terminate

Is it okay to throw in a noreturn noexcept function instead of calling std::terminate?

本文关键字:调用 std terminate 函数 noexcept noreturn 是否      更新时间:2023-10-16

我正在制作一个小的错误处理系统,我想做一个终止程序的致命错误。我想到了两种方法:

[[noreturn]] inline void fatal_error1(char const* msg) {
    std::terminate();
}
[[noreturn]] inline void fatal_error2(char const* msg) noexcept {
    throw std::runtime_error{msg};
}

有什么理由不建议使用fatal_error2吗?该函数的目标是终止程序,我什至将其标记为noreturn,但每个人似乎都告诉我不要抛出noexcept 函数。

我很想使用 fatal_error2,因为它在终端中输出what(),而我需要在该标头中包含一些输出函数才能在 fatal_error1 中打印消息。

有什么

理由不建议使用fatal_error2吗?

如果您想打电话给std::terminate - 只需这样做。这是最佳做法,因为它遵循最小意外原则

fatal_error2被声明为 noexcept 但它抛出了一个异常,这使得代码的读者怀疑作者的意图。


我很想使用fatal_error2,因为它在终端中输出what()......

这似乎不是一个很好的借口,因为:

  1. 此功能不可移植,C++标准不需要。
  2. 您可以使用std::cerr << msg << std::endlfprintf(stderr, ...)自己携带。而且,同样,这使代码的读者清楚地了解了您的意图。

是的,没关系。

最终结果是,您正在强制实施未处理的异常。(未经处理的异常与从noexcept范围引发异常相同)

这就像没有可以捕获您抛出的异常的捕获块一样。就像您在帖子中提到的,当程序终止时,您可能会获得有关未捕获异常的一些信息,这可能很有用。

有人可能会说,最好写信给std::err,然后打电话给std::terminate.我不会反对它,但它确实需要#include <iostream>.这是否比要求#include <stdexcept>更好是你的决定。