More Exceptional C++中文版试读(异常安全议题及技术)

深入解析五大ADC芯片架构及其应用场景 本文深入解析了五大ADC芯片架构及其应用场景,包括逐次逼近型ADC、Σ-Δ型ADC、流水线型ADC、闪存型ADC和积分型ADC。通过详细的架构分析和实际应用案例,帮助工程师理解不同ADC芯片的特点和适用场景,提升电路设计效率。 阅读详情
[Herb Sutter 的名作More Exceptional C++中文版即将出版。作为本书译者,我很高兴将本书推荐给大家。征得华中科技大学出版社同意,我将公开部分译稿,敬请大家批评指正。] 

  

 

异常安全议题及技术

 

 

 

在现代C++程序设计中,对异常安全(exception safety)议题一无所知却想写出健壮的代码,这无异于痴人说梦。的确如此。

 

如果你在使用C++标准库,哪怕只是用到了new,你也得为异常做好准备。本章建立在Exceptional C++相应章节的基础上,并讨论了新的议题及相关技术,例如:std::uncaught_exception()是什么?它能帮助你写出更健壮的代码吗?异常安全影响到类的设计吗?或者,它可以只是作为事后的改进手段来使用吗?为什么要用管理者对象(manager objects)来封装资源所有权?为什么“资源获取才是初始化”的认识对于编写安全代码如此重要?

 

但首先还是让我们来热身一下,看一个有关异常安全的基本话题;这个话题对以下非常重要的C++基本概念进行了说明,并剖析了其更深层的含义:构造具有什么含义?什么是对象的生命期?

 

 

条款17:构造函数失败,之一:

对象生命期

 

难度:4

确切地说,构造函数产生异常时到底会发生些什么?如果异常来自子对象或成员对象的构造期间,情况又会怎样?

 

1. 请看下面这个类:

 

    // 例17-1

    //

    class C : private A

    {

      B b_;

    };


在C的构造函数中,如何捕捉从基类子对象(例如A)或成员对象(例如b_)的构造函数中抛出的异常?

 

2. 请看下面的代码:

 

    // 例17-2

    //

    {

      Parrot p;

    }

 

这个对象的生命期何时开始?何时结束?在对象的生命期之外,对象处于什么状态?最后,如果它的构造函数抛出了一个异常,那将意味着什么?

 

解答

 

在C++中增加function try block这一特性后,函数可以捕获异常的范围稍微增大了一些。本条款的内容涉及:

 

·在C++中,对象构造与构造失败的含义;

·基类或成员子对象的构造函数抛出异常时,function try block可用于转化(而非抑制)这个异常。

 

方便起见,除非特别指出,本条款中的“成员”指的是“非静态的类数据成员”。

 

Function Try Block

1. 请看下面这个类:

 

    // 例17-1

    //

    class C : private A

    {

      B b_;

    };

 

在C的构造函数中,如何捕捉从基类子对象(例如A)或成员对象(例如b_)的构造函数中抛出的异常?

 

这正是function try block的用武之地:

 

    // 例17-1(a): 构造函数的function try block

    //

C::C()


try

      : A ( /*...*/ ) // 可选的初始化列表

      , b_( /*...*/ )

    {

    }

    catch( ... )

    {

      // 一旦A::A()或B::B()抛出异常,我们会来到这儿

 

      // 如果A::A()成功,然后B::B()抛出异常,

      // C++语言将保证,在到达本catch block

      // 之前,A::~A()会被调用,以摧毁已经创建

      // 的基类A子对象。

    }

 

然而,更有趣的问题是:你为什么会想到这么做?这个问题引出了本条款两大要点的第一个。

 

对象生命期与构造函数异常的含义

过一会儿,我们将回答一个问题,即,上面C的构造函数是否可以(或应该)吸收(absorb)A或B的构造函数产生的异常,从而完全不发出异常。在可以正确回答这个问题之前,我们需要完全了解对象生命期1的概念,以及构造函数抛出异常的含义。

 

2. 请看下面的代码:

 

    // 例17-2

    //

    {

      Parrot p;

    }

 

这个对象的生命期何时开始?何时结束?在对象的生命期之外,对象处于什么状态?最后,如果它的构造函数抛出了一个异常,那将意味着什么?

 

让我们一次回答一个问题:

 

问:一个对象的生命期何时开始?

答:当它的构造函数成功执行完毕并正常返回之时。也就是说,当控制(control)抵达构造函数体的末尾之时,或执行完一个更早的return语句之时。

 

问:一个对象的生命期何时结束?

__________________

1. 为简化起见,我在这里所说的只是类型为class、具有构造函数的对象的生命期。


答:当它的析构函数开始执行之时。也就是说,当控制抵达析构函数体的开始处之时。

 

问:对象的生命期结束之后,对象处于什么状态?

答:我们的回答正如一位知名软件大师曾经表述的那样:在谈到一段类似的代码时,他将局部对象(local object)拟人化地称为“他”:

 

    // 例17-3

    //

    {

      Parrot& perch = Parrot();

    }

    // <-- 独白从这里开始

 

他并非日渐消瘦!他已经逝去!这只鹦鹉(Parrot)已经芳踪不再!他已经停止了生命!他已经死亡,去见他的造物者去了!他是死尸!被剥夺了生命,安静长眠!如果你没有把他放在枝头(perch),它已经命归黄土![甚至更早,在这个代码块尾部之前]他的代谢过程已经作古!他离开了枝头!他已经撒手人寰,摆脱了尘世的烦恼,拉上了生命的帷幕,加入了唱师班,无影无踪!这是一只前世的鹦鹉(ex-Parrot)!

 

——Dr. M.Python, B.Math, MA.Sc., Ph.D. (CompSci)2

 

撇开玩笑不说,此处的重点在于:在生命期开始之前与生命期结束之后,对象的状态完全一样——没有对象存在。就是这样。这一结论将我们带到第二个重要问题前:

 

问:从构造函数中抛出异常意味着什么?

答:这意味着构造已经失败,对象从没存在过,它的生命期从没开始过。确实,报告构造失败——也就是说,无法正确构造出某种类型的有效对象——的唯一方法是抛出一个异常。(是的,有一条如今已经过时的编程规则是这么说的:“如果程序出了问题,可以将一个状态标志设为‘bad’,让调用者通过一个IsOK()函数去检查它”;后面,我会对此谈谈我的看法。)

 

顺便说一句,如果构造函数不成功,析构函数就永远不会被调用,其原因正在于此——没有东西可以摧毁。它无法死亡,因为它从来就未曾生存过。请注意,这样一来,“一个对象的构造函数抛出异常”这句话实际上具有矛盾性。这样一种东西甚至不能被称为一个前对象(ex-object)。它从没有生存过,从没有加入过对象家族。它是一个非对象(non-object)。

 

__________________

2. 向Monty Python致歉。


对于C++的构造函数模型,我们可以总结如下:

只会是二者之一:

 

a) 构造函数正常返回,即,控制抵达函数体的尾部,或者执行了一个return语句。这种情况下,对象真实存在。

b) 构造函数抛出异常后退出。这种情况下,对象不仅不会继续存在,而且,实际上它根本就从未作为一个对象存在过。

 

没有其它的可能性。具备了这些知识,我们就可以更好地应对下一条款中的问题了:可否吸收异常?

ESD笔记(三)_常用ESD保护电路优缺点 根据ESD防护器件的TLP I-V特性我们可将ESD器件分为回滞类和非回滞类两种; 回滞类的ESD器件包括NPN三极管、栅极接地 NMOS ( GGNMOS, Gate-grounded NMOS )、可控桂(SCR, siliconcontrolled rectifier)等。 非回滞类的ESD器件包括二极管、二极管串、沟道工作的MOS管、PNP三极管、栅极接电源的PMOS(GDPMOS)等,与回滞类ESD器件相比,其TLP曲线没有负阻区的存在。 常用于ESD防护的器件包括PN结二极管、GGN 阅读详情

相关推荐

STM32F103C8T6通过ESP8266连接阿里云物联网平台(附代码)

STM32F103C8T6连接阿里云物联网平台(1)—阿里云lot Studio控制 Web开发 分享一下自己使用stm32f103c8t6通过ESP_01模块连接阿里云物联网平台,实现温湿度上传和控制命令下达的过程,能力有限,用的是最简单的方法,如有错误,多多担待。 一、硬件选型 1、 stm32f103c8t6 2、ESP_01 wifi模块 3、其他 二、硬件连接 WSP_01 STM32F103C8T6 RXD PA2 TXD PA3 RES PA4 VCC 3.3

weixin_A13253323604 3万+

以上文章是effectiveC++ 手册的译文

来源是http://www.leftworld.net/online/effectivec/index.htmlLostmouse简介认识优快云已经很久了,但开始写技术文章不过是不久前的事,开辟这个专栏更是出于偶然。因为工作方面的原因,不能保证自己一直会有大块的时间来维护这个专栏,但我会尽力。至于Lostmouse本人,并非卡通中那只聪明可爱的小老鼠;相反,却是一只将至而立却还在迷惘的老猫:

IT老兵 1119

ROS开发者的福音:用Anaconda虚拟环境解决Python包冲突(附完整配置流程)

本文为ROS开发者提供了使用Anaconda虚拟环境解决Python包冲突的完整方案。通过分析冲突根源,详细介绍了Miniconda安装、专用环境创建以及核心桥梁包的配置流程,并阐述了“混合环境运行”与“纯虚拟环境构建”两种实战工作流,帮助开发者实现ROS核心与特定Python库的和谐共存,从而提升开发效率和项目可维护性。

weixin_28835789的博客 339

Exceptional C++ Syle 学习笔记

看完了《Exceptional C++ Syle》,现将书中一些重要的东西记下来,以供以后翻阅。   第1条        vector的使用  使用vetor∷at,该成员函数会进行下标越界检查以确保当前vector中的确包含了需要的元素。 名言:一般说来,不应该为不使用的东西付出代价。 使用operator[],标准并不强制operator[]进行越界检查,高效性。   size

Desilting's 足迹 2463

麒麟桌面操作系统QT开发环境搭建

麒麟操作系统安装Qt

因为热爱,所以坚持,记录工作中的乐趣 9275

STM32G4系列数字LLC控制程序开发实战

本文详细介绍了基于STM32G4系列MCU的数字LLC控制程序开发全流程。从开发环境搭建、中断服务函数设计,到核心的电压环PID算法、Burst模式控制、状态机设计以及软启动优化,提供了完整的实战代码和关键参数调试经验,帮助开发者高效实现高性能数字电源控制。

weixin_29185493的博客 281

More Exceptional C++ 中文版试读(译序及目录)

 [Herb Sutter 的名作More Exceptional C++中文版即将出版。作为本书译者,我很高兴将本书推荐给大家。征得华中科技大学出版社同意,我将公开部分译稿,敬请大家批评指正。]  与大师面对面(译序)  小提琴家穆特录制过一张唱片,收录的是贝多芬最伟大的两部小提琴作品1。聆听那张唱片,你仿佛听见贝多芬在向你倾诉他对音乐艺术的理解和感悟、为你解答小提琴音乐创作

lostmouse的专栏 1803

YOLOv11改进策略【卷积层】| CVPR-2024 PKI Module 获取多尺度纹理特征,适应尺度变化大的目标

PKI Module是。

Limiiiing的博客 2711

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 254

手把手教你学PCIE--基本概念:PCIe 初始化流程概述

硬件上电复位:系统上电时,所有 PCIe 设备都会进行复位。链路训练(Link Training):主机和设备之间通过链路训练状态机(LTSSM)协商链路参数(如速度和宽度)。配置空间访问:主机通过配置空间读写来发现和配置设备。资源分配:主机为设备分配内存映射 I/O 区域(BARs)、中断向量等资源。驱动程序加载和高级配置:操作系统加载设备驱动程序,并进行更高级的配置和状态监控。硬件上电复位:确保所有设备处于已知的良好状态。链路训练:主机和设备通过 LTSSM 协商链路速度和宽度。

MHD0815的博客 1376

matlab 异常值检测与处理——Robust Z-score法【2024最新版】

博客长期更新,本文最近一次更新时间为:2024年12月9日。

点云侠的博客 1516

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 394

TMS320F28335调试跟踪的问题:DSP从上电复位,一直到执行main()的第一条语句之间,都干了些什么,以及CCS调试时程序查找的问题

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1213

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 349

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 88

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基

本文系统梳理C++类与对象的核心知识点,涵盖类的定义、访问限定符(public/private)、类作用域、对象实例化及内存布局。重点解析封装思想、this指针机制、空类大小为1字节的原因,以及类与对象在内存中的存储差异。通过对比C语言结构体与C++类,揭示面向对象设计的优势:数据保护、接口统一、命名隔离与代码可维护性提升。内容由浅入深,适合作为学习笔记与复习参考。

2602_95684935的博客 500

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 307

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 450

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 251

1-10 PostgreSQL中多表连接全解:inner/left/right/full/cross join

本文基于 PostgreSQL 15+ 完整拆解 5 种主流连接:内连接、左连接、右连接、全连接、笛卡尔连接。结合可落地的测试数据,演示每种连接的执行逻辑、返回结果,重点剖析 NULL 值对 JOIN 匹配的核心影响,彻底解决多表连接数据丢失、匹配异常、结果错乱的问题。

zhangjw34的专栏 105

【C++ 基础入门】C++继承(下):问题、底层原理与组合

C++继承(菱形继承的问题、虚继承原理、继承与组合、构造顺序)

2601_96587588的博客 802

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 170

c++ explicit关键字详解

explicit。

拒绝AI文,努力在AI时代写出感动人心的好文章 151

825 mW 顶上 212 °C:ASM491S 的 105 °C/W、250 mA 短路电流与热关断

25 °C 环境里结温 34.1 °C,125 °C 环境里结温 134.1 °C——后者已经离 150 °C 只有 16 °C 了,但还在范围内。换个角度看同一件事:从 25 °C 和从 125 °C 起算,温升都是 86.6 °C,但一个到 111.6 °C(还在范围内),一个到 211.6 °C(远远超限)。这个算例里 20 °C/W 是我假设的,实际值取决于机壳材料、密封程度、有没有风扇,跨度可以从 5 °C/W 到 50 °C/W 以上。外面 50 °C 的机箱,盒内就是 63.9 °C。

ANSILIC的博客 393

《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试

本文系统完成了Gemini模型通过OpenAI兼容API的接入开发,基于Apifox验证接口规范,设计并实现GeminiProvider类,涵盖初始化、状态检测、全量响应等核心功能。重点处理了代理配置强制校验、Bearer鉴权、JSON序列化与响应解析等工程细节,并通过GTest与CMake完成单元测试,验证链路可用性。项目遵循策略模式,保持与DeepSeek、ChatGPT等模型的统一抽象接口,显著提升SDK可扩展性。

2501_91275995的博客 398
上一篇: More Exceptional C++中文版试读(继承与多态)
下一篇: More Exceptional C++中文版试读(优化与性能)
lostmouse
博客等级 码龄26年 22粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值