是否可以使用noreturn noexcept函数而不是调用std :: terminate?

时间:2017-10-10 14:01:37

标签: c++ c++14 noexcept

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

[[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中打印消息。 / p>

2 个答案:

答案 0 :(得分:7)

  

有没有理由不建议使用fatal_error2?

如果您想致电std::terminate - 就这样做。这是最佳做法,因为它遵循the principle of least surprise

fatal_error2被声明为noexcept,但它会引发异常,这会使代码的读者怀疑作者的意图。

  

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

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

  1. 此功能不可移植,C ++标准不要求。
  2. 您可以使用std::cerr << msg << std::endlfprintf(stderr, ...)移植自己。而且,这再次使您的意图对读者清楚了。

答案 1 :(得分:1)

是的,没关系。

最终结果是您强制执行未处理的异常。 (未处理的异常与从noexcept范围抛出异常相同)

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

有些人可能会说写std::err然后拨打std::terminate会更好。我不反对它,但确实需要#include <iostream>。是否比要求#include <stdexcept>更好,这是你的号召。