现代 C++ 处理异常和错误的最佳做法

您所在的位置:网站首页 不可恢复的故障怎么处理 现代 C++ 处理异常和错误的最佳做法

现代 C++ 处理异常和错误的最佳做法

2024-07-03 19:53| 来源: 网络整理| 查看: 265

现代 C++ 处理异常和错误的最佳做法 项目03/28/2024

在新式 C++ 中,在大多数情况下,报告和处理逻辑错误与运行时错误的首选方式是使用异常。 当堆栈可能在检测错误的函数与具有错误处理上下文的函数之间包含多个函数调用时,这种方式尤其有用。 异常为检测错误的代码提供正式的、妥善定义的方式,以将信息向上传递到调用堆栈。

对异常代码使用异常

程序错误通常分为两类:

编程错误导致的逻辑错误。 例如,“索引超出范围”错误。 超出程序员控制的运行时错误。 例如,“网络服务不可用”错误。

在 C 样式的编程和 COM 中,错误报告的管理方式是返回一个表示错误代码或特定函数的状态代码的值,或者设置一个全局变量,调用方可以在每次执行函数调用后选择性地检索该变量来查看是否报告了错误。 例如,COM 编程使用 HRESULT 返回值将错误传达给调用方。 Win32 API 提供 GetLastError 函数来检索调用堆栈报告的最后一个错误。 在这两种情况下,都需要由调用方识别代码并相应地做出响应。 如果调用方未显式处理错误代码,则程序可能会在不发出警告的情况下崩溃。 或者,它可能会继续使用错误的数据执行,并生成错误的结果。

新式 C++ 中优先使用异常的原因如下:

异常会强制调用代码识别并处理错误状态。 未经处理的异常会停止程序执行。 异常跳转到调用堆栈中可以处理错误的位置。 中间函数可以让异常传播。 这些函数不必与其他层协调。 引发异常后,异常堆栈展开机制将根据妥善定义的规则销毁范围内的所有对象。 异常可以在检测错误的代码与处理错误的代码之间实现明确的分离。

以下简化示例演示了 C++ 中引发和捕获异常的必要语法:

#include #include #include using namespace std; void MyFunc(int c) { if (c > numeric_limits< char> ::max()) { throw invalid_argument("MyFunc argument too large."); } //... } int main() { try { MyFunc(256); //cause an exception to throw } catch (invalid_argument& e) { cerr


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3