当前位置: 首页 > news >正文

C++核心指导原则: 错误处理

C++ Core Guidelines 整理目录

  1. 哲学部分
  2. 接口(Interface)部分
  3. 函数部分
  4. 类和类层次结构部分
  5. 枚举部分
  6. 资源管理部分
  7. 性能部分
  8. 错误处理

E: Error handling

E.1: Develop an error-handling strategy early in a design

  • 翻译: 在设计早期制定一个错误处理策略。
  • 原因: 为确保代码的健壮性和可维护性,应在项目初期就规划好如何处理可能出现的错误。

E.2: Throw an exception to signal that a function can’t perform its assigned task

  • 翻译: 抛出异常以表明函数无法完成其指定的任务。
  • 原因: 使用异常机制来清晰地表达程序执行中的错误情况,以便调用者可以采取适当的措施。

E.3: Use exceptions for error handling only

  • 翻译: 仅将异常用于错误处理。
  • 原因: 避免将异常用于正常的控制流逻辑,这样可以使错误处理代码与正常业务逻辑分离,提高代码的清晰度。

E.4: Design your error-handling strategy around invariants

  • 翻译: 围绕不变量设计你的错误处理策略。
  • 原因: 确保在发生错误时,对象的状态不会被破坏,保持对象内部的一致性。

E.5: Let a constructor establish an invariant, and throw if it cannot

  • 翻译: 让构造函数建立一个不变量,并在无法做到时抛出异常。
  • 原因: 构造函数应保证对象在其创建时处于有效状态,如果不能实现这一点,则应该通知用户。

E.6: Use RAII to prevent leaks

  • 翻译: 使用 RAII(Resource Acquisition Is Initialization)防止泄漏。
  • 原因: 通过 RAII 技术确保资源在使用完毕后能够正确释放,避免资源泄漏问题。

E.7: State your preconditions

  • 翻译: 声明你的前置条件。
  • 原因: 明确指出函数调用前必须满足的条件,帮助调用者正确使用函数,减少运行时错误。

E.8: State your postconditions

  • 翻译: 声明你的后置条件。
  • 原因: 翻译函数执行完成后应满足的条件,有助于验证函数是否按预期工作。

E.12: Use noexcept when exiting a function because of a throw is impossible or unacceptable

  • 翻译: 在不可能或不可接受因为抛出异常而退出函数的情况下使用noexcept
  • 原因: 通过明确指出函数不会抛出异常来优化性能,并帮助编译器进行更严格的错误检查。

E.13: Never throw while being the direct owner of an object

  • 翻译: 永远不要在直接拥有对象时抛出异常。
  • 原因: 防止资源泄漏和未定义行为的发生,确保即使在发生异常时也能正确管理资源。

E.14: Use purpose-designed user-defined types as exceptions (not built-in types)

  • 翻译: 使用专为异常设计的用户自定义类型(而不是内置类型)作为异常。
  • 原因: 提高代码的可读性和可维护性,使得异常处理更加精确和有意义。

E.15: Throw by value, catch exceptions from a hierarchy by reference

  • 翻译: 抛出时传递值,捕获异常层次结构中的异常时使用引用。
  • 原因: 确保异常处理机制高效且避免潜在的对象切片问题。

E.16: Destructors, deallocation, swap, and exception type copy/move construction must never fail

  • 翻译: 析构函数、释放内存、交换操作以及异常类型的拷贝/移动构造函数绝不能失败。
  • 原因: 维护程序的稳定性,防止因资源管理相关的操作失败而导致的程序崩溃。

E.17: Don’t try to catch every exception in every function

  • 翻译: 不要在每个函数中尝试捕捉所有异常。
  • 原因: 仅在能够有效处理特定异常的地方捕捉它们,保持代码清晰和模块化。

E.18: Minimize the use of explicit try/catch

  • 翻译: 尽量减少显式的 try/catch 使用。
  • 原因: 降低代码复杂度,使异常传播自然,只在确实需要处理异常的地方使用 try/catch。

E.19: Use a final_action object to express cleanup if no suitable resource handle is available

  • 翻译: 如果没有合适的资源处理器可用,则使用final_action对象表达清理操作。
  • 原因: 确保资源在任何情况下都能得到正确的释放,避免资源泄漏。

E.25: If you can’t throw exceptions, simulate RAII for resource management

  • 翻译: 如果你不能抛出异常,则模拟 RAII(Resource Acquisition Is Initialization)进行资源管理。
  • 原因: 在无法使用异常的情况下,通过手动释放资源的方式确保资源不会泄漏,维持程序的稳定性。

E.26: If you can’t throw exceptions, consider failing fast

  • 翻译: 如果你不能抛出异常,则考虑快速失败。
  • 原因: 当检测到错误时立即停止程序执行,避免进一步的损害或不可预测的行为,使问题更容易定位和修复。

E.27: If you can’t throw exceptions, use error codes systematically

  • 翻译: 如果你不能抛出异常,则系统地使用错误码。
  • 原因: 作为一种替代机制来处理错误情况,确保所有可能的错误都能被明确识别和处理。

E.28: Avoid error handling based on global state (e.g. errno)

  • 翻译: 避免基于全局状态(如errno)的错误处理。
  • 原因: 全局状态容易导致意外的副作用和难以调试的问题,使用更明确的错误传递方式有助于提高代码的可读性和维护性。

E.30: Don’t use exception specifications

  • 翻译: 不要使用异常规范(exception specifications)。
  • 原因: 异常规范在 C++中已被弃用,并且可能导致性能开销和复杂性增加,推荐使用其他方法来处理异常。

E.31: Properly order your catch-clauses

  • 翻译: 正确排列你的 catch 子句。
  • 原因: 按照从具体到一般的顺序排列 catch 子句,确保特定类型的异常能够被正确捕获并处理,避免未捕获或错误捕获的情况发生。

相关文章:

  • 论文笔记(七十二)Reward Centering(三)
  • 洛谷P8771 [蓝桥杯 2022 省 B] 填空问题
  • 实时数仓如何建设
  • DPVS-5: 后端服务监控原理与测试
  • u3d预制件笔记
  • Ollama部署本地大模型DeepSeek-R1-Distill-Llama-70B
  • 微软将OpenAI的野心外包给软银?
  • 初步学习java 动态代理
  • MySQL的InnoDB引擎中的聚簇索引和非聚簇索引有什么区别?
  • 二级公共基础之数据库设计基础(一) 数据库系统的基本概念
  • 内容中台重构企业内容管理的价值维度与实施路径
  • 自动化测试是什么?如何学习自动化测试?为什么要做自动化测试?
  • 解决数据库建表错误:ERROR 1064 (42000) You have an error in your SQL
  • VantUI官网更新2025,移动端前端开发
  • 【Jenkins】显示 HTML 标签
  • 小智AI桌宠机器狗
  • 测试面试题:以一个登录窗口为例,设计一下登录界面测试的思路和方法
  • DirectX12(D3D12)基础教程三 线性代数与3D世界空间
  • SpringAI 快速开发Deepseek
  • 跟着AI学vue第十章
  • 企业网站开发课程的能力应用/青岛的seo服务公司
  • 临沂网站排名/上海搜索引擎推广公司
  • 网站建设维护培训班/营销培训内容有哪些
  • 网络管理软件app/黑锋网seo
  • 公司网站建设设计/危机公关处理
  • 怎么把淘宝店放到自己做的网站去/seoul是什么国家