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

news/2025/2/26 1:23:46

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 子句,确保特定类型的异常能够被正确捕获并处理,避免未捕获或错误捕获的情况发生。

http://www.niftyadmin.cn/n/5867027.html

相关文章

基于物联网的家庭版防疫面罩设计与实现(论文+源码)

2.1 功能设计 本次基于物联网的家庭版防疫面罩设计采用单片机作为主控核心,利用温度检测模块、红外检测模块、风扇控制器模块、紫外线消毒模块、报警提示模块构成整个系统。在系统设计上,主要包括以下功能: (1)系统具…

机器学习数学基础:32.斯皮尔曼等级相关

斯皮尔曼等级相关教程 一、定义与原理 斯皮尔曼等级相关系数(Spearman’s rank - correlation coefficient),常用 ρ \rho ρ表示,是一种非参数统计量,用于衡量两个变量的等级之间的关联程度。它基于变量的秩次&…

【第五节】C++设计模式(创建型模式)-Prototype(原型)模式

目录 一、问题背景 二、 模式选择 三、讨论总结 一、问题背景 在软件开发中,有时我们需要通过已有对象来创建新对象,而不是从头开始构建。这种需求让我想起了现代制造业中的 3D 打印技术。通过扫描一个现有的物体,3D 打印机可以快速复制出…

SpringSecurity基于注解实现方法级别授权:@PreAuthorize、@PostAuthorize、@Secured

Spring Security 访问权限系列文章: 《SpringSecurity基于配置方法控制访问权限:MVC匹配器、Ant匹配器》 《SpringSecurity基于注解实现方法级别授权:@PreAuthorize、@PostAuthorize、@Secured》 《SpringSecurity设置白名单》 方法调用授权的含义很明确,与 HTTP 端点级别的…

【GESP】C++二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵

GESP二级模拟题,多层循环、分支语句练习,难度★✮☆☆☆。 题目题解详见:https://www.coderli.com/gesp-2-luogu-b3995/ 【GESP】C二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵 | OneCoderGESP二级模拟题,多层循环、分…

Codes 开源免费研发项目管理平台 2025年第一个大版本3.0.0 版本发布及创新的轻IPD实现

Codes 简介 Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台,支持云端认证、本地部署、全部功能开放,并且对 30 人以下团队免费。它通过创新的方式简化研发协同工作,使敏捷开发更易于实施。并提供低成本的敏捷开发解决方案&#xff0…

【RK3588嵌入式图形编程】-SDL2-构建交互式按钮

构建交互式按钮 文章目录 构建交互式按钮1、回顾UI组件2、创建按钮类3、鼠标悬停事件4、处理点击事件5、创建派生按钮6、扩展功能6.1 禁用和启用按钮6.2 鼠标悬停反应7、总结在本文中,将探索构建响应用户输入的UI组件的技术。 在本文中,我们将学习如何使用SDL在C++中构建交互…

大语言模型中的 Token如何理解?

在大语言模型中,Token 是文本处理的基本单元,类似于“文字块”,模型通过将文本分割成Token来理解和生成内容。举一个形象一点的例子,可以理解为 AI 处理文字时的“最小积木块”。就像搭乐高时,每块积木是基础单位一样&…