首页 > 编程语言 >Effective C++读书笔记——item8(析构函数与异常)

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

时间:2025-01-04 18:33:37浏览次数:8  
标签:item8 函数 Effective 读书笔记 程序 未定义 析构 异常 DBConn

析构函数引发异常的问题

  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. 核心原则:析构函数应该永不引发异常。若析构函数调用可能抛出异常的函数,需捕捉所有异常并抑制它们或者终止程序;如果类的客户需要对某个操作抛出的异常做出回应,该类应提供常规的非析构函数来完成此操作,因为析构函数引发异常有导致程序过早终止或出现未定义行为的风险,让客户通过非析构函数处理异常是给他们应对错误的机会。

标签:item8,函数,Effective,读书笔记,程序,未定义,析构,异常,DBConn
From: https://blog.csdn.net/weixin_46032775/article/details/144917591

相关文章

  • Effective C++读书笔记——item2(const,enum,inlines取代#define)
    关于用常量取代#define的总体原则在编程中,应尽量减少预处理器(特别是#define)的使用,可通过合适的替代方式来避免#define带来的诸多问题,虽然不能完全消除预处理器相关指令(如#include、#ifdef/#ifndef仍有重要作用),但要让其使用频率降低。简单常量方面问题阐述:使用#defi......
  • 2024165读书笔记|《飞花令·合》——人生飘忽百年内,且须酣畅万古情
    2024165读书笔记|《飞花令·合》——人生飘忽百年内,且须酣畅万古情屈原班婕妤曹植刘绘卢思道卢照邻苏味道刘希夷李白高适杜甫司空曙白居易温庭筠韦庄窦叔向张泌林逋柳永晏殊欧阳修李觏舒亶秦观陈瓘李清照陆游辛弃疾姜夔蒋捷吴伟业纳兰性德张惠言邓廷桢《飞花令·合》......
  • 读书笔记~管理修炼~避免无意义的内卷
      剧场效应:避免无意义的内卷   电影院里,大家都在认真看电影。忽然,有一个观众站了起来,或许是想看得更清楚,或许是因为前面的人太高挡住了他。他站起来后,他后面的人也站了起来,然后陆陆续续周围的人都站了起来。最后,电影院里的人都站了起来,每个人都累,却没有得到更多的好处......
  • 读书笔记~管理修炼-学会往前看
    反事实思维:学会往前看   “要是早出门半小时就好了,现在就不会错过飞机了。”   “要是刚才没买那件衣服就好了,现在就能买这件了。”   “要是……就好了”,这样的句式出现,大概率代表了一种思维模式——反事实思维。   反事实思维是诺贝尔经济学奖丹尼尔......
  • 读书笔记3
    《程序员的修炼之道:从小工到专家》第八章主要探讨了如何进行有效的软件项目管理,以及在项目管理中的最佳实践。以下是这一章节的读书笔记,总结了重要观点和概念。软件开发不仅仅是编写代码,良好的项目管理是确保项目成功的关键要素。项目管理涵盖了计划、执行、监控和收尾等整个过程......
  • 读书笔记2
    《程序员的修炼之道:从小工到专家》的第七章主要集中在与他人协作的艺术,关注团队合作及沟通技巧在软件开发中的重要性。以下是这一章节的读书笔记,概述了主要观点和关键概念。在现代软件开发中,程序员通常不再单打独斗,团队合作是取得成功的关键。成功的软件项目常常依赖于团队成员之......
  • 读书笔记
    《程序员的修炼之道:从小工到专家》的第六章主要集中在如何持续学习与自我提升。以下是这一章节的读书笔记,概述了其中的一些主要观点和概念。程序员的职业生涯中,技术是不断发展的,学习新技术和工具已成为必然。提升自己的技能是走向专家之路的重要一步。持续学习不仅可以增广自己的......
  • Effective C++ 条款40:明智而审慎地使用多重继承
    文章目录条款40:明智而审慎地使用多重继承示例1:多重继承中的歧义示例2:避免菱形继承问题示例3:合理使用多重继承总结条款40:明智而审慎地使用多重继承多重继承(MultipleInheritance)允许一个类从多个基类继承。然而,与单一继承相比,多重继承更加复杂,可能带来以下问题和......
  • 《程序员修炼之道:从小工到专家》读书笔记(七)
    这一次读书笔记是关于第六章“当你编码时”,第六章章深入探讨了实际编码过程中的一系列实用技巧和最佳实践,聚焦程序员在日常编写代码过程中的思维模式与注意事项,助力开发者产出高质量、易维护、可读性强的代码,将前期积累的设计理念、应对变化策略落实到指尖敲击的每一行字符中,是从......
  • 《程序员修炼之道:从小工到专家》读书笔记(六)
    这篇读书笔记是关于第五章“弯曲,或折断”,这是一个富有哲理的章节,它通过一个形象的比喻,传达了在软件开发过程中应对变化和压力的重要原则。这一章的核心思想是强调在面对不可避免的变化和挑战时,程序员应该学会“弯曲”——即灵活地适应和调整,而不是固执地抵抗以至于“折断”。弯曲......