为“异常”努力是值得的

异常是OO语言处理错误的方式,在C++中,鼓励使用异常。侯捷再书中谈起异常,“十年前撰写“未将异常考虑在内的”函数是为一种美好实践,而今我们致力于写出“异常安全码”。”可见异常安全的重要。

说起异常安全,首先就要是异常的出现是为弥补C语言缺陷。再者,将介绍异常的概念,异常安全的条件。

C语言处理错误的缺陷

  • 程序意外终止

                比如:内存申请错误,越界,除0错误,会直接终止程序

  • 错误码难以解读

                在出错后会返回一个数字(错误码)。此时会包含俩层含义:是错误信息?是结果?

                错误码需要程序员查找相关库信息

     出现错误直接终止程序是非常不允许的情况。

C++异常的引入

异常:当一个函数出现自己无法解决的错误时,可以抛出异常,让函数的直接或间接调用者处理这个问题。

处理异常的三个关键字:

throw:当问题出现时,要抛出异常,通过throw抛出

catch:用于捕获异常。可以有多个catch

try:try中的代码将被激活特定的异常,try后跟着一个或多个catch块。

try要和catch匹配使用。

catch块中的内容不一定会被执行,只有当异常抛出且被捕获时才会执行,否则不执行。

	try {//保护块}catch (ExceptionName e1){//}catch (ExceptionName e2){//}

异常的抛出与匹配规则

  • 异常是有抛出对象引发的,该对象类型决定调用哪个块的。比如:抛出int类型的异常,catch参数为int的来接收。实际上:抛出和捕获类型不一定要相同,这里可以抛出派生对象。


  • 选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个。


  • 异常抛出的对象后,会生成一个临时拷贝,传给catch

在实际运用中,抛异常抛出通常对象是一个类,包含错误信息和错误码。

由于私有成员在内外拿不到,故通过函数调用返回错误信息和错误码。

对于临时拷贝的类型是const 故函数要添加const,才可调用。


  • catch(...)可以捕获任意类型的对象。

抛出的异常在没有继承情况下,要匹配相应的类型才能被捕获,会在catch中一直匹配,直到catch(...)处理任意类型。但是无法得到抛出的异常对象。

异常的重新抛出

对于内存资源申请,抛异常要极为谨慎。
在上述的例子中,虽然有对内存资源释放,但是抛异常后捕捉异常跨越栈帧,导致内存没有被释放。内存的申请没有释放是一件很严重的事情。
在这里,希望能在main函数中,将内存释放。
我们必须将异常重新抛出,在Func函数中,捕获异常,再将异常重新抛出。

异常安全


具有异常安全的函数会

  • 不泄露任何资源。例如上述代码在抛出异常后,后续的delete不会被调用。
  • 不允许数据败坏。异常抛出后,异常被捕获,导致栈帧的跳跃,关键信息没有被执行。

解决资源泄露是比较轻松的

确保析构,智能指针。

这里我们专注解决数据败坏的问题。

在构造函数中,最好不要抛异常,可能会导致没有完全构造

析构过程最好不好抛异常

在lock和unlock抛异常会导致死锁

异常安全函数有以下三个保证

  • 基本承诺

        如果异常被抛出,程序内任何事物都保持在有效状态,没有任何对象和数据结构被破坏,所有对象处于一种内部前后一致的状态。

  • 强烈保证

        如果函数调用成功,就完全成功。如果函数失败,程序就恢复到调用之前状态。

  • 不抛掷保证

        承诺异常绝不抛出,因为它们总能够完成它们原先承诺的功能。

在C++11中,如果一个函数明确的不抛异常的话,就用noexcept

thread() noexcept;
thread (thread&& x) noexcept;

异常优点

  • 可以清晰展示错误信息
  • 抛异常可以直接拿到错误信息,不需要重重返回。
  • 第三方库的异常安全很规范
  • 部分函数更好检查。如构造函数没有返回值。

缺点

执行的跳跃,乱流。追踪程序困难。

C++没有垃圾回收机制,异常任意导致内存泄漏

标准库的异常不完善。

异常是被鼓励使用。时间不断前进,我们与时俱进!

参考:
<<Effective c++>>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/212728.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka中的auto-offset-reset配置

Kafka这个服务在启动时会依赖于Zookeeper&#xff0c;Kafka相关的部分数据也会存储在Zookeeper中。如果kafka或者Zookeeper中存在脏数据的话&#xff08;即错误数据&#xff09;&#xff0c;这个时候虽然生产者可以正常生产消息&#xff0c;但是消费者会出现无法正常消费消息的…

linux高级篇基础理论七(Tomcat)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

AWS攻略——创建VPC

文章目录 创建一个可以外网访问的VPCCIDR主路由表DestinationTarget 主网络ACL入站规则出站规则 子网创建EC2测试连接创建互联网网关&#xff08;IGW&#xff09;编辑路由表 知识点参考资料 在 《AWS攻略——VPC初识》一文中&#xff0c;我们在AWS默认的VPC下部署了一台可以SS…

GAN:WGAN-GP-带有梯度惩罚的WGAN

论文&#xff1a;https://arxiv.org/pdf/1704.00028.pdf 代码&#xff1a;GitHub - igul222/improved_wgan_training: Code for reproducing experiments in "Improved Training of Wasserstein GANs" 发表&#xff1a;2017 WGAN三部曲的终章-WGAN-GP 摘要 WGAN在…

炫云云渲染支持corona11了!

2023年11月30日&#xff0c;Chaos Corona官网上更新了Corona 11 for 3ds Max和Corona 11 for Cinema 4D版本&#xff0c;这一新版带来了众多令人惊艳的全新功能&#xff0c;为设计师带来了更好的设计体验。炫云云渲染作为渲染行业比较有实力的云渲染&#xff0c;紧随其后&#…

制作一个RISC-V的操作系统三-编译与链接

文章目录 GCCGCC简介GCC的命令格式gcc -Egcc -cgcc -Sgcc -ggcc -vGCC的主要执行步骤GCC涉及的文件类型针对多个源文件的处理 ELFELF介绍ELF文件格式ELF文件处理相关工具&#xff1a;Binutils&#xff08;binary utility&#xff09;readlelf -hreadelf -S或readelf -SW&#x…

便宜SSL证书

首先&#xff0c;我们需要了解什么是SSL证书。简单来说&#xff0c;SSL证书是一种用于加密网站数据传输的安全协议&#xff0c;它可以确保用户在访问网站时&#xff0c;数据能够安全地从服务器传输到用户的浏览器。没有SSL证书的网站&#xff0c;用户在访问时可能会遇到不安全的…

crmeb本地开发配置代理

crmeb 是一个开源的商城系统&#xff0c; v5 版本是一个前后端分离的项目&#xff0c; 我们从git仓库中下载下来的是一个文件夹&#xff0c;其结构是这样的 我的系统没有使用docker &#xff0c;使用的是 laragon 的系统 所以首先我们要在 nginx 中配置 之后&#xff0c; 我们…

十五届蓝桥杯分享会(一)

注&#xff1a;省赛4月&#xff0c;决赛6月 一、蓝桥杯整体介绍 1.十四届蓝桥杯软件电子赛参赛人数&#xff1a;C 8w&#xff0c;java/python 2w&#xff0c;web 4k&#xff0c;单片机 1.8w&#xff0c;嵌入式/EDA5k&#xff0c;物联网 300 1.1设计类参赛人数&#xff1a;平…

Emacs之dired模式重新绑定键值v(一百三十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Python函数默认参数设置

在某些情况下&#xff0c;程序需要在定义函数时为一个或多个形参指定默认值&#xff0c;这样在调用函数时就可以省略为该形参传入参数值&#xff0c;而是直接使用该形参的默认值。 为形参指定默认值的语法格式如下&#xff1a; 形参名 默认值 从上面的语法格式可以看出&…

什么是网站?

这篇文章是我学习网站开发&#xff0c;阶段性总结出来的。可以帮助你 通俗易懂 地更加深刻理解网站的这个玩意。 一&#xff0c;网站和网页的区别&#xff1f; 网站是由一个个网页组成。我们在浏览器上面看到的每一个页面就是网页&#xff0c;这些 相关的 网页组成一个网站。…

shell命令学习(1)——(待完善)

explainshell.com shell统计当前文件夹下的文件个数、目录个数Linux之shell常用命令&#xff08;三&#xff09; sort&#xff08;排序&#xff09;、uniq&#xff08;处理重复字符&#xff09; linux中shell将换行输入到文件中 shell脚本&#xff0c;将多行内容写入文件中 f…

[idea]idea连接clickhouse23.6.2.18

一、安装驱动 直接在pom.xml加上那个lz4也是必要的不然会报错 <dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.4.2</version></dependency><dependency><group…

数据链路层之VLAN基本概念和基本原理

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Numpy数组的数据类型汇总 (第4讲)

Numpy数组的数据类型 &#xff08;第4讲&#xff09;         &#x1f379;博主 侯小啾 感谢您的支持与信赖。☀️ &#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&…

前端——html拖拽原理

文章目录 ⭐前言⭐draggable属性&#x1f496; api&#x1f496; 单向拖动示例&#x1f496; 双向拖动示例 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端——html拖拽原理。 vue3系列相关文章&#xff1a; vue3 fastapi 实现选择目录所有文…

资深测试总结,性能测试目的如何做?主要看什么指标?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试是什么…

python:傅里叶分析,傅里叶变换 FFT

使用python进行傅里叶分析&#xff0c;傅里叶变换 FFT 的一些关键概念的引入&#xff1a; 1.1.离散傅里叶变换&#xff08;DFT&#xff09; 离散傅里叶变换(discrete Fourier transform) 傅里叶分析方法是信号分析的最基本方法&#xff0c;傅里叶变换是傅里叶分析的核心&…

无头浏览器与Selenium:探索无界爬虫的奇妙世界

selenium设置无头浏览器 背景 ​ 我们之前的selenium都是浏览器驱动自动打开一个网页&#xff0c;执行相关操作&#xff0c;其实也可以让其后台显示&#xff0c;不用在前台显示。 ​ 要设置无头浏览器&#xff0c;可以使用Selenium的Headless模式。在Headless模式下&#xf…