为“异常”努力是值得的

news2024/11/19 9:35:32

异常是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.coloradmin.cn/o/1294601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费的网页抓取工具大全【2024最新】

在当今数字化时代&#xff0c;信息的获取变得愈发重要。企业、学者、研究人员都在努力寻找一种高效、可靠的方式从海量的互联网数据中提取有价值的信息。本文将深入探讨各种网页抓取工具的类型。 揭秘网页抓取工具的丰富多样 在网络数据抓取的领域&#xff0c;有多种工具可供…

校园网无法登录IEEE

校园网无法登录IEEE 取消IPV6协议版本的对勾

python数据分析总结(pyecharts)

目录 安装依赖 Demo pyecharts.options 图表绘制 WordCloud.shape 安装依赖 pip install pyecharts Demo ### 对象式 from pyecharts.charts import Bar bar Bar() bar.add_xaxis([1,2,3,4,5]) bar.add_yaxis("数据1",[40,56,65,23,56]) bar.add_yaxis("数…

CleanMyMac X清理垃圾软件有哪些功能?2024版本更新啥内容

如今电脑成为大多数人工作的工具&#xff0c;使用得越久就越需要清理垃圾软件。系统垃圾、废纸娄垃圾、大型和旧文件这些通常都占用了我们的电脑几G的空间。 想要清除不必要的垃圾文件&#xff0c;可以使用mac卸载软件CleanMyMac X&#xff0c;这款清理垃圾软件可以智能扫描Ma…

Linux查看命令的绝对路径

linux查看命令的绝对路径 在Linux中&#xff0c;可以使用以下命令来查看命令的绝对路径&#xff1a; 1、which 命令名 例如&#xff0c;要查看chronyc命令的绝对路径&#xff0c;可以运行&#xff1a; which chronyc 2、whereis 命令名 例如&#xff0c;要查看chronyc命令…

探究Logistic回归:用数学解释分类问题

文章目录 前言回归和分类Logistic回归线性回归Sigmoid函数把回归变成分类Logistic回归算法的数学推导Sigmoid函数与其他激活函数的比较 Logistic回归实例1. 数据预处理2. 模型定义3. 训练模型4. 结果可视化 结语 前言 当谈论当论及机器学习中的回归和分类问题时&#xff0c;很…

横向扩展统一存储与备份服务器功能

Infortrend 更新了GS&#xff0c;GSe&#xff0c;GSe Pro统一存储系列的备份服务器功能。该功能降低数据备份成本&#xff0c;并提供灵活的备份策略。通过备份服务器功能&#xff0c;用户可以通过多种途径实现数据备份&#xff0c;包括公有云&#xff08;兼容S3&#xff09;、文…

物联网+AI智慧工地云平台源码(SaaS模式)

智慧工地云平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程管…

docker镜像仓库hub.docker.com无法访问

docker镜像仓库hub.docker.com无法访问 文章主要内容&#xff1a; 介绍dockerhub为什么无法访问解决办法 1 介绍dockerhub为什么无法访问 最近许多群友都询问为什么无法访问Docker镜像仓库&#xff0c;于是我也尝试去访问&#xff0c;结果果然无法访问。 大家的第一反应就是…

仅需30秒完美复刻任何人的声音 - 最强AI音频11Labs

我的用词一直都挺克制的&#xff0c;基本不会用到“最强”这个字眼。 但是这一次的这个AI应用&#xff0c;是我认为在TTS&#xff08;文字转音频&#xff09;这个领域&#xff0c;当之无愧的“最强”。 ElevenLabs&#xff0c;简称11Labs。 仅需30秒到5分钟左右的极少的数据集…

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

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

MYSQL主从复制配置指引

MYSQL主从复制配置指引 1.前期准备 部署完主备数据库&#xff0c;初始化主备库表结构和数据。 2. 主库配置修改 修改主库配置文件etc/my.cnf&#xff0c;新增以下配置&#xff1a; #服务器 id&#xff0c;需唯一 server-id 1 #二进制文件存放路径 log-bin mysql-bin …

『TypeScript』从零开始编写你的第一个TypeScript程序

&#x1f4e3;读完这篇文章里你能收获到 了解TypeScript及为什么使用TypeScriptTypeScript的安装过程编写第一个HelloTs程序 文章目录 一、TypeScript简介1. 什么是TypeScript&#xff1f;2. 为什么选择使用TypeScript&#xff1f;2.1 静态类型检查2.2 更好的代码维护性2.3 更…

C++基础 -42- STL库之list链表

———————STL库之list链表——————— &#x1f384; list链表的格式(需要定义头文件) list<int> data1(4, 100);list<int> data2(4, 500);&#x1f384;list链表的合并接口 &#x1f384;举例使用合并接口并且验证 data2.merge(data1);list<int>::…

Java网络通信-第21章

Java网络通信-第21章 1.网络程序设计基础 网络程序设计基础涵盖了许多方面&#xff0c;包括网络协议、Web开发、数据库连接、安全性等。 1.1局域网与互联网 局域网&#xff08;LAN&#xff09;与互联网&#xff08;Internet&#xff09;是两个不同的概念&#xff0c;它们分…

【小白专用】MySQL入门(详细总结)

3. 创建数据库 使用 create database 数据库名; 创建数据库。 create database MyDB_one; create database DBAliTest; 创建数据库成功后&#xff0c;数据库的数量变成了6个&#xff0c;多了刚才创建的 dbalitest 。 4. 创建数据库时设置字符编码 使用 create database 数据…

泰裤辣!这个网站制作电子产品册很轻松

电子产品册的制作对于许多企业来说是一项重要的任务&#xff0c;它不仅能够帮助企业展示自己的产品&#xff0c;还能够提高企业的品牌形象和市场竞争力。 这个网站能够轻松制作电子产品册&#xff0c;这无疑是一个非常有用的工具&#xff0c;可以帮助许多企业节省时间和精力&am…

小白学java栈的经典算法问题——第四关白银挑战

内容1.括号匹配问题2.最小栈3.最大栈 1.括号匹配问题 栈的典型题目还是非常明显的&#xff0c;括号匹配、表达式计算等等几乎都少不了栈&#xff0c;本小节我们就看两个最经典的问题 首先是LeetCode20,链接 本道题还是比较简单的&#xff0c;其中比较麻烦的是如何判断两个符…

Nacos未授权访问

漏洞描述 Nacos 是阿里巴巴推出来的一个新开源项目&#xff0c;是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。致力于帮助发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;可以快速实现动态服务发现、服务配置、服务元数据及流量管…

轨道电流检测IC——FP355,助力蓄电池充电器、SPS(适配器)、电池管理系统、多口快充充电器的优雅升级

目录 一、FP355概述 二、FP355特点 三、FP355应用 随着移动设备的普及和人们对电力需求的不断增长&#xff0c;充电器的安全性和充电效率成为了重要的关注点。 作为一种能够精确检测电流的集成电路&#xff0c;轨道电流检测IC——FP355是个不错的选择。它不仅广泛应用于蓄电…