我正在制作一个小错误处理系统,我想做一个终止程序的致命错误。我想到了两种方法:
[[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>
答案 0 :(得分:7)
有没有理由不建议使用fatal_error2?
如果您想致电std::terminate
- 就这样做。这是最佳做法,因为它遵循the principle of least surprise。
fatal_error2
被声明为noexcept
,但它会引发异常,这会使代码的读者怀疑作者的意图。
我很想使用
fatal_error2
因为它在终端输出what()
...
这似乎不是一个好借口,因为:
std::cerr << msg << std::endl
或fprintf(stderr, ...)
移植自己。而且,这再次使您的意图对读者清楚了。答案 1 :(得分:1)
是的,没关系。
最终结果是您强制执行未处理的异常。 (未处理的异常与从noexcept
范围抛出异常相同)
这与没有可以捕获您抛出的异常的catch块相同。就像你在帖子中提到的那样,你可能会在程序终止时获得有关未捕获异常的一些信息,这可能很有用。
有些人可能会说写std::err
然后拨打std::terminate
会更好。我不反对它,但确实需要#include <iostream>
。是否比要求#include <stdexcept>
更好,这是你的号召。