Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 插入一个noreturn noexcept函数而不是调用std::terminate可以吗?_C++_C++14_Noexcept - Fatal编程技术网

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()

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

  • 此功能不是可移植的,并且不需要C++标准。<李>
  • 你可以用
    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
    的诱惑背后添加我的动机。不可移植确实是一个很大的缺点,并且正确地表达了意图。我必须权衡利弊。谢谢你的提示!这样说吧,我仍然必须包括一些东西,这挫败了我最初的动机。然而,拥有与未捕获异常相同的行为使其非常吸引人。不仅用于输出,也用于调试。