C++ 插入一个noreturn noexcept函数而不是调用std::terminate可以吗?
我正在做一个小错误处理系统,我想做一个致命的错误来终止程序。我想到了两种方法:C++ 插入一个noreturn noexcept函数而不是调用std::terminate可以吗?,c++,c++14,noexcept,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}; } 是否有理由不建议使用致命错误2?该函数的目标是终
[[noreturn]] inline void fatal_error1(char const* msg) {
std::terminate();
}
[[noreturn]] inline void fatal_error2(char const* msg) noexcept {
throw std::runtime_error{msg};
}
是否有理由不建议使用致命错误2
?该函数的目标是终止程序,我甚至将其标记为noreturn,但每个人似乎都告诉我不要使用noexcept函数
我很想使用致命错误2
,因为它在终端中输出what()
,而我需要在该头中包含一些输出函数,以便在致命错误1
中打印消息
是否有理由不建议使用致命错误2
如果您想调用std::terminate
,请这样做。这是最佳实践,因为它遵循
fatal_error 2
声明为,但它引发异常,这使代码的读者怀疑作者的意图
我很想使用
致命错误2
,因为它在终端中输出what()
这似乎不是一个好借口,因为:
std::cerr自己携带,是的,没关系
最终的结果是,您正在强制执行一个未处理的异常。(未处理的异常与从noexcept
范围引发异常相同)
这与没有可以捕获您抛出的异常的catch块相同。正如您在文章中提到的,当程序终止时,您可能会得到一些关于未捕获异常的信息,这可能很有用
有些人可能会说,最好先写入std::err
,然后调用std::terminate
。我不会反对它,但它确实需要一个#include
。这是否比要求一个#include
更好是你的问题。std::terminate()方法有什么问题吗?如果不是,你为什么要寻找替代方案?第二种方法不推荐,因为它与第一种方法相同,但并不明显。@Borgeader well。。。在第一个版本中,我必须包含iostream
以输出错误,而在大多数系统中,异常版本输出what()
。这可能不是选择fatal\u error2
的最佳理由,但该错误处理功能将在我的程序中的很多地方使用,我不太想在任何地方都包含iostream
,甚至stdio
。为什么需要包含iostream
,或任何其他与I/O相关的头,无处不在?@molbdnilo(包括标题)是可传递的。如果我包含了fatal.h
,而该文件包含了iostream
,那么我有效地将iostream包含在了所有地方。我编辑这个问题是为了在我使用fatal\u error2
的诱惑背后添加我的动机。不可移植确实是一个很大的缺点,并且正确地表达了意图。我必须权衡利弊。谢谢你的提示!这样说吧,我仍然必须包括一些东西,这挫败了我最初的动机。然而,拥有与未捕获异常相同的行为使其非常吸引人。不仅用于输出,也用于调试。