Effective C++读书笔记——item8(析构函数与异常)

embedded/2025/1/7 13:27:36/

析构函数引发异常的问题

  1. 异常同时存在的隐患:C++ 虽未禁止在析构函数中引发异常,但坚决阻止这样做。以std::vector等容器包含对象为例,当容器析构时要析构其中元素,若在析构元素(如Widget类对象)过程中连续抛出异常,出现两个或多个活动异常时,程序可能会终止或者出现未定义行为,使用其他标准库容器、TR1 中的容器甚至数组等情况都可能引发同样问题,即便不涉及容器和数组,析构函数引发异常也可能导致程序过早终止或出现未定义行为。

  2. 资源管理类示例中的问题:以DBConnection类及管理它的DBConn类为例,若DBConn类析构函数调用DBConnection类的close方法(假设close可能抛出异常),当异常抛出后,析构函数传播该异常会带来麻烦,因为这相当于把棘手问题抛出去了,不符合析构函数的特性。

避免析构函数引发异常麻烦的常见方法及问题

  1. 终止程序:像在DBConn析构函数中通过try-catch捕获异常,若捕获到异常则记录日志后调用abort终止程序。这种做法适用于析构过程遭遇错误后程序无法继续运行的情况,好处是能防止因析构函数传播异常导致的未定义行为。
  2. 抑制异常:同样在DBConn析构函数的try-catch中,捕获异常后只记录日志,不向外传播异常。不过通常抑制异常不是好主意,因为会隐瞒操作失败的重要信息,但在某些程序能在忽略错误后继续可靠运行的场景下,这比冒程序过早终止或出现未定义行为的风险更可取。这两种方法的共同问题是程序无法对引起close抛出异常的条件做出有效回应。

更好的策略及相关理念

  1. 改进接口设计:设计DBConn类的接口,让客户有机会对可能出现的问题做出回应。比如提供close函数给客户去调用处理异常,同时类内部跟踪连接是否已关闭,若客户未关闭则在析构函数中进行 “候补” 关闭操作。这样能防止连接泄漏,若析构函数中关闭操作失败,还可再采取终止程序或抑制异常的做法。
  2. 核心原则:析构函数应该永不引发异常。若析构函数调用可能抛出异常的函数,需捕捉所有异常并抑制它们或者终止程序;如果类的客户需要对某个操作抛出的异常做出回应,该类应提供常规的非析构函数来完成此操作,因为析构函数引发异常有导致程序过早终止或出现未定义行为的风险,让客户通过非析构函数处理异常是给他们应对错误的机会。

http://www.ppmy.cn/embedded/151380.html

相关文章

客户案例:基于慧集通平台集成打通小满CRM+金蝶云星空+钉钉

一、引言 本案例原型公司是一家生物科技公司,公司自开创以来专注于体外诊断生物活性原材料的研究、生产、销售和服务,致力于为全球体外诊断试剂生产企业提供领先且具有竞争力的核心原料和相关辅助产品服务。公司以卓越的产品和优质的服务赢得了客户的广…

项目优化之策略模式

目录 策略模式基本概念 策略模式的应用场景 实际项目中具体应用 项目背景: 策略模式解决方案: 计费模块策略模式简要代码 策略模式基本概念 策略模式(Strategy Pattern) 是一种行为型设计模式,把算法的使用放到环境类中,而算…

初步认识UML

在软件开发中,理解系统的结构、设计和流程对团队协作至关重要。统一建模语言(Unified Modeling Language,简称 UML)是一种标准化的图形化语言,帮助开发者通过图表直观地描述和设计系统。无论是软件架构师、开发者&…

探索 Vue.js 的动态样式与交互:一个有趣的样式调整应用

修改日期备注2025.1.3初版 一、前言 今天和大家分享在 Vue.js 学习过程中开发的超酷的小应用。这个应用可以让我们通过一些简单的交互元素,如复选框、下拉菜单和输入框,来动态地改变页面上元素的样式哦 让我们一起深入了解一下这个项目的实现过程&…

Java程序猿搬砖笔记(十八)

文章目录 MySQL索引命名规范、索引使用规范SpringBoot使用Lazy解决循环依赖问题SpringBoot循环依赖的6种解决方案Nginx超时时间设置Linux统计当前文件夹下的文件个数、目录个数Linux查看内存使用情况命令Git更换远程仓库地址TPS、QPS、RT、吞吐量、最佳线程数量的理解MySQL多表…

电子电器架构 --- 智能座舱与AI结合

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源&…

ubuntu支持ssh

Ubuntu 默认是支持 SSH 的,但通常并不会在安装时启用 SSH 服务。为了能够远程连接到 Ubuntu 系统,需要安装并启动 SSH 服务器(即 OpenSSH)。以下是如何在 Ubuntu 系统中启用和配置 SSH 服务的步骤: 检查 SSH 是否已安…

2024 年 docker 提示index.docker.io

发现 docker 提示以下错误: Error response from daemon: Get "https://index.docker.io/v1/search?qnginx&n25": dialing index.docker.io:443 container via direct connection because has no HTTPS proxy: connecting to index.docker.io:443:…