是否可以引入 noreturn noexcept 函数而不是调用 std::terminate
Is it okay to throw in a noreturn noexcept function instead of calling std::terminate?
我正在制作一个小的错误处理系统,我想做一个终止程序的致命错误。我想到了两种方法:
[[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()
......
这似乎不是一个很好的借口,因为:
- 此功能不可移植,C++标准不需要。
- 您可以使用
std::cerr << msg << std::endl
或fprintf(stderr, ...)
自己携带。而且,同样,这使代码的读者清楚地了解了您的意图。
是的,没关系。
最终结果是,您正在强制实施未处理的异常。(未经处理的异常与从noexcept
范围引发异常相同)
这就像没有可以捕获您抛出的异常的捕获块一样。就像您在帖子中提到的,当程序终止时,您可能会获得有关未捕获异常的一些信息,这可能很有用。
有人可能会说,最好写信给std::err
,然后打电话给std::terminate
.我不会反对它,但它确实需要#include <iostream>
.这是否比要求#include <stdexcept>
更好是你的决定。
相关文章:
- 为什么 std::unique 不调用 std::sort?
- 在 C++20 之前,在带有常量或引用字段的"A"上调用 'std::vector<A>
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 在调用 std::bind 的产品后意外调用析构函数
- 在抛出 what() 的实例后调用'std::logic_error'终止:basic_string::_M_construct 空无效
- 有没有办法扩展和调用 std::functions 的元组?
- 调用std::函数成员时内存损坏
- 如何在C++03中用自定义谓词调用std::unique
- 未调用 std::unique_ptr 中的自定义删除器
- 从多个线程调用 std::shuffle
- 由于调用 std::condition_variable 后参数无效而导致应用程序崩溃
- 访问并调用 std::function 的变体
- 错误:调用 std::thread 没有匹配函数
- 为什么调用shared_from_this调用 std::终止
- C++天鹅座的错误;没有用于调用"std::basic_fstream..."的匹配函数
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 防止线程在处理异常后在分离时调用 std::terminate()
- C++线程中调用 std::terminate 时程序返回代码
- 如果从类成员初始值设定项引发的异常调用 std::terminate()
- 线程是否真的在调用 std::future::get() 后启动