Fad*_*mic 9 c++ error-handling
我正在重构旧代码,我想解决的一个问题是处理错误的方式.我很清楚异常以及它们是如何工作的,但我并不完全确定它们是我正在尝试处理的情况的最佳解决方案.
在这段代码中,如果事情没有验证,那么解开堆栈真的没有理由或优势.我们完成了.尝试保存船只没有意义,因为它是一个非交互式代码,通过Sun Grid Engine并行运行.用户无法干预.更重要的是,这些验证失败并不真正代表特殊情况.他们是预料之中的.
那我该如何最好地解决这个问题呢?我不确定自己想要的一件事是每个类方法中的退出点都可能失败.这似乎无法维持.我错了吗?在这样的代码中调用exit()或abort()处于失败点是否可以接受?或者我应该一直抛出一个异常回到main中的一些泛型catch语句?有什么好处?
抛出异常并在 main 中捕获然后退出意味着您的 RAII 资源对象被清理。在大多数系统上,许多资源类型都不需要这样做。操作系统将清理内存、文件句柄等(尽管我使用过一个无法释放内存的系统,这意味着它在系统重新启动之前一直处于分配状态,因此程序退出时泄漏不是一个好主意。)
但您可能希望彻底释放其他资源类型,例如网络或数据库连接,或者您正在驾驶且需要安全关闭的机械设备。如果应用程序使用很多这样的东西,那么您可能更愿意抛出异常以将堆栈展开回主程序,然后退出。
因此,适当的退出方法取决于应用程序。如果应用程序知道它是安全的,那么调用 _Exit()、abort()、exit() 或 Quickexit() 可能是完全合理的。(库代码不应该调用这些,因为显然该库不知道它对于每个将使用该库的应用程序是否安全。)如果在应用程序退出之前必须执行一些关键的清理,但您知道它是有限的,然后应用程序可以通过 atexit() 或 at_quick_exit() 注册清理代码。
因此,基本上决定需要清理的内容,记录它,实施它,并尝试确保它经过测试。
| 归档时间: |
|
| 查看次数: |
6888 次 |
| 最近记录: |