c++ - 错误后如何结束C++程序?

标签 c++ error-handling

我正在重构旧代码,我想解决的一件事是处理错误的方式。我很清楚异常及其工作原理,但我不完全确定它们是我要处理的情况的最佳解决方案。

在这段代码中,如果事情没有通过验证,就没有理由或优势展开堆栈。我们完成了。试图拯救这艘船是没有意义的,因为它是通过 Sun Grid Engine 并行运行的非交互式代码。用户无法干预。更重要的是,这些验证失败并不真正代表异常情况。他们是意料之中的。

那么我该如何最好地处理这个问题呢?我不确定我想要的一件事是每个可能失败的类方法中的退出点。这似乎无法维护。我错了吗?在这样的代码中,仅在失败点调用 exit()abort() 是否可以接受?或者我应该一直抛出异常返回到 main 中的某个通用 catch 语句吗?有什么好处?

最佳答案

抛出一个异常被 main 捕获然后退出意味着你的 RAII 资源对象被清理了。在大多数系统上,很多资源类型都不需要这样做。操作系统将清理内存、文件句柄等(尽管我使用的系统未能释放内存意味着它在系统重启之前一直处于分配状态,因此在程序退出时泄漏不是一个好主意。)

但是,您可能还想完全释放其他资源类型,例如网络或数据库连接,或者您驾驶的机械设备需要安全关闭。如果一个应用程序使用了很多这样的东西,那么您可能更愿意抛出异常以将堆栈展开回 main,然后退出。

因此,适当的退出方法取决于应用程序。如果应用程序知道它是安全的,那么调用 _Exit()、abort()、exit() 或 quickexit() 可能是完全合理的。 (库代码不应该调用这些,因为显然库不知道它对于每个将使用该库的应用程序是否安全。)如果在应用程序退出之前必须执行一些关键清理,但您知道它是有限的,然后应用程序可以通过 atexit() 或 at_quick_exit() 注册清理代码。

因此基本上决定您需要清理的内容、记录它、实现它并尝试确保它经过测试。

关于c++ - 错误后如何结束C++程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10686997/

相关文章:

c++ - 摆脱字符串文字末尾的\0 的最佳方法是什么?

c++ - 将组合框添加到 win32 API

php - 如何修复num验证和0值错误代码以使其正常工作以及连接多个错误以立即显示

c - Lua设置默认错误处理程序

javascript - 为什么多功能代码行不会产生错误而只是停止执行?

iphone - CGBitmapContextCreate的处理错误

c++ - 为什么 CopyConstructible 定义提到 "rvalue expression of const T"?

c++ - 在类内成员更改时终止线程中的循环

c++ - std::optional 背后的基本原理是什么?

swift - 在 Swift 中抛出多个异常