gpt4 book ai didi

c++ - 中止、终止或退出?

转载 作者:IT老高 更新时间:2023-10-28 11:54:56 29 4
gpt4 key购买 nike

这三者有什么区别,如果出现我无法正确处理的异常,我应该如何结束程序?

最佳答案

  • abort 表示程序“异常”结束,并引发 POSIX 信号 SIGABRT,这意味着您为该信号注册的任何处理程序都将被调用,尽管程序在任何一种情况下仍将终止后记。通常您会在 C 程序中使用 abort 来退出意外错误情况,其中错误可能是程序中的错误,而不是诸如错误输入或网络故障之类的错误。例如,如果发现数据结构中包含 NULL 指针,而从逻辑上讲,这种情况永远不会发生,您可能会 abort

  • exit 表示程序“正常”结束,尽管这仍可能表示失败(但不是错误)。换句话说,如果用户提供了无法解析的输入,或者无法读取文件,您可能会 exit 并返回错误代码。退出代码 0 表示成功。 exit 还可以选择在程序结束之前调用处理程序。这些是通过 atexiton_exit 函数注册的。

  • std::terminate 是 C++ 程序中出现未处理异常时自动调用的内容。这本质上是与 abort 等效的 C++,假设您通过抛出异常来报告所有异常错误。这将调用由 std::set_terminate 函数设置的处理程序,默认情况下该函数只调用 abort

在 C++ 中,您通常希望避免在出错时调用 abortexit,因为您最好抛出异常并让代码进一步在调用堆栈中决定结束程序是否合适。你是否使用 exit 来获得成功是一个环境问题——在 main 中的 return 语句以外的地方结束程序是否有意义。

std::terminate 应该被视为最后的错误报告工具,即使在 C++ 中也是如此。 std::terminate 的问题是终止处理程序确实 not 有权访问未处理的异常,因此无法判断它是什么。通常最好将整个 main 包装在 try { } catch (std::exception& ex) { } block 中。至少你可以报告更多关于从 std::exception 派生的异常的信息(当然,不是从 std::exception 派生的异常最终仍会未处理)。

try { } catch(...) { } 中包装 main 的主体并不比设置终止处理程序好多少,因为您再次没有访问有问题的异常。 编辑:根据 Neil Butterworth 的回答,在这种情况下,堆栈是展开的,这对于未处理的异常来说是不正确的(有点令人惊讶)。

关于c++ - 中止、终止或退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2820285/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com