C++——异常

        异常是在程序执行的过程中发生了某种错误,异常的处理机制允许我们讲发生的异常抛出给程序的另外一部分,对这个错误进行处理。这个机制让问题检测的环节和问题处理的环节分离。检测环节只需要负责检测即可,无需关系解决的细节问题。在C语言中处理错误的方式主要是错误码,错误码的本质是对错误信息进行了分类编号,拿到错误码以后还要再去查询错误信息,比较麻烦。异常抛出时,抛出的是一个对象,这个对象可以包涵更多的信息。

        程序在出现问题的时候,我们可以通过throw一个对象来引发一个异常,该对象的类型以及当前的调用链决定了这个异常会被哪个catch捕捉到。异常会被当前调用链中与该异常类型匹配且离抛出异常位置最近的那应该catch捕捉到。当throw被执行以后,throw后面的代码就不再执行。程序的执行逻辑会从throw的位置跳转到捕捉到这个异常的那个catch的位置,这个catch可能是当前函数的一个局部的catch,也可以是调用链中另外一个函数中的catch,程序的控制权就从throw的位置转移到了catch的位置,也就是说:在这个调用链上的函数可能会提早结束,同时在处理异常时,在调用链上从throw位置到catch位置之间创建的对象都会被销毁。

      抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的这个异常对象可能是一个局部对象,同时处理这个异常的catch也不在当前的函数中,所以会生成一个临时对象,这个拷贝的对象会在catch语句后销毁。(这里类似于函数的传值返回)  

一、栈展开

        抛出异常以后,程序会暂停当前函数的执行,首先程序会检查当前的throw是否在try块的内部,如果在就开始查找匹配的catch语句,如果当前的catch不匹配,则会沿着调用链向上继续寻找,直到找到匹配的catch语句或者达到main函数也没有找到匹配的catch语句,此时程序会调用terminate函数终止程序,如果找到了匹配的catch语句后,执行完catch块内的语句后,会从这个catch语句后继续执行,这个过程就被叫做栈展开。

二、查找匹配的处理代码

        一般情况下抛出对象和catch的类型是完全匹配的,如果有多个匹配的类型,那么会选择离他距离最近的那一个。

        但是也有一些例外,允许从非常量向常量的类型转化,也就是权限的缩小;允许数组转化成指向数组元素类型的指针,函数被转换成指向这个函数的指针;允许从派生类向基类类型的转换。

        然后到了main函数这个异常都没有被匹配就会终止程序,为了防止这种的情况的发生,我们一般会在main函数的最后使用catch(...),这样catch可以捕捉任意类型的异常,但是并不能知道捕捉到的异常错误是什么。

三、异常重新抛出

       有的时候catch到一个异常对象后,需要对错误进行分类,其中的某种异常错误需要特殊的,其他的错误则重新抛出异常给外层的调用链处理。捕捉异常后需要重新抛出直接throw就可以把捕捉到的这个异常直接抛出。

四、异常安全问题

        异常抛出后,后面的代码就不再执行,前面申请的资源会在后面进行释放,但是可能中间会抛出异常,这样就会导致后面释放资源的代码不会执行,就因为异常引发了资源泄漏的问题,为了解决这个问题我们可以用到RAII的方式,后面会讲的智能指针就是利用了这种思想。

        其次在析构函数中,如果需要抛出异常也要谨慎处理,比如析构函数中要释放十个资源,但是释放到第五个资源的时候抛出异常了,此时后面的五个资源就不会被释放了,就也造成了资源泄漏的问题。

五、异常规范

        对于用户和编译器而言,预先知道某个程序会不会抛出异常是很有好处的,有助于简化调用函数的代码。

        在C++98中在函数参数列表的后面接上throw(),表示这个函数不会抛出异常,函数参数列表后接上throw(类型1,类型2...)表示这个函数可能会抛出多种类型的异常,可能会抛出的异常类型用逗号分割。

        C++11只需要在函数参数列表后面加上noexcept表示不会抛出异常,什么都不加表示可能会抛出异常。

        编译器在编译时并不会检查noexcept,也就是说一个函数用noexcept修饰了。但是它又同时包含了throw语句或者它调用的函数可能会抛出异常,编译器还是会顺利通过的。但是如果用noexcept声明过的函数抛出了异常,程序就会终止。

        noexcept(expression)还可以作为⼀个运算符去检测⼀个表达式是否会抛出异常,可能会则返回true,不会就返回false。

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

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

相关文章

Linux相关概念和易错知识点(19)(HDD、Block group)

目录 1.HDD (1)HDD存储描述 (2)HDD结构图 (3)磁盘管理的分治思想 (4)硬盘中文件系统的整体划分图 2.Block group (1)文件管理 ①文件属性的存储 ②in…

WWDC24(Xcode 16)中全新的 Swift Testing 使用进阶

概述 WWDC 24 祭出的全新单元测试系统着实让苹果开发者们眼前一亮。“原来测试还可以这么爽!?”,日渐逼近蟋蟀发型的某位码农如是说。 Swift Testing 在简洁性以及灵活性全面超越老大哥 XCTest 的同时,也让秃头码农们真正见识到了…

k8s-service、endpoints、pod之间是怎么进行网络互通的

k8s-service、endpoints、pod之间是怎么进行网络互通的 1、service2、endpoints3、service、endpoints、pod通信图4、不同服务pod内部间访问 1、service 在K8S中,Service是一种抽象,定义了一组Pod的逻辑集合和访问这些Pod的策略。首先,我们需…

命令行工具PowerShell使用体验

命令行工具PowerShell使用 PowerShell是微软开发的一种面向对象的命令行Shell和脚本语言环境,它允许用户通过命令行的方式管理操作系统。相较于传统CMD,PowerShell增加了面向对象的程序设计框架,拥有更强大的功能和扩展性。使用PowerShell可…

企业IT架构转型之道:阿里巴巴中台战略思想与架构实战感想

文章目录 第一章:数据库水平扩展第二章:中台战略第三章:阿里分布式服务架构HSF(high speed Framework)、早期Dubbo第四章:共享服务中心建设原则第五章:数据拆分实现数据库能力线性扩展第六章&am…

【优选算法篇】微位至简,数之恢宏——解构 C++ 位运算中的理与美

文章目录 C 位运算详解:基础题解与思维分析前言第一章:位运算基础应用1.1 判断字符是否唯一(easy)解法(位图的思想)C 代码实现易错点提示时间复杂度和空间复杂度 1.2 丢失的数字(easy&#xff0…

在 WPF 中,绑定机制是如何工作的?WPF数据绑定机制解析

在WPF(Windows Presentation Foundation)中,数据绑定机制是其核心功能之一,广泛用于连接应用程序的UI(用户界面)和应用程序的业务逻辑层。数据绑定允许你将UI元素与数据源(如对象、集合或其他数…

基于 STM32 的天气时钟项目中添加天气数据的网络获取功能

基于 STM32 的天气时钟项目中添加天气数据的网络获取功能,您需要确保您的开发环境具备网络连接能力。这里以 ESP8266 Wi-Fi 模块为例,详细说明如何实现网络获取天气数据的功能。 1. 硬件连接 连接 ESP8266 模块 请参考以下连接方式,将 ESP82…

晓宇电视 1.9 | 电视直播软件,几千频道,高清秒播

晓宇电视是一款电视直播软件,提供数千个高清频道,支持秒播。最大的特色是没有广告,且不需要用户手动更新源地址。安装后即可使用,频道节目丰富,包括影视剧轮播专区,用户可以轻松观看喜爱的电影和电视剧。软…

双指针算法的妙用:提高代码效率的秘密(2)

双指针算法的妙用:提高代码效率的秘密(2) 前言: 小编在前几日讲述了有关双指针算法两道题目的讲解,今天小编继续进行有关双指针算法习题的讲解,老规矩,今天还是两道题目的讲解,希望…

MySQL:客户端工具创建数据库

MySQL 是一个开源的关系型数据库管理系统(RDBMS),用于存储、管理和检索数据。MySQL是基于SQL语言的,它具有高效、可靠、易用的特点。 客户端工具 这个mysqld.exe就在计算机安装的数据可服务,启动之后,mys…

使用python向钉钉群聊发送消息

使用python向钉钉群聊发送消息 一、在钉钉群中新建机器人二、使用代码发送消息 一、在钉钉群中新建机器人 在群设置中添加机器人 选择自定义 勾选对应的安全设置 完成后会展示webhook,将地址复制出来,并记录,后面会用到 二、使用代码发送消…

【芯智雲城】Sigmastar星宸科技图传编/解码方案

一、图传技术简介 图传是指将图像或媒体内容从一个设备传输到另外一个设备的技术,传输的媒介可以是无线电波、光纤、以太网等。图传系统主要由图像采集设备、传输设备和接收设备组成,图像采集设备负责采集实时图像,传输设备将采集到的图像转…

sql专题 之 常用命令

文章目录 查询基础语法查询全表查询选择查询&#xff1a;常量和运算&#xff1a; 条件查询where运算符&#xff1a;、 !、<、>空值&#xff1a;null模糊查询&#xff1a;like逻辑运算&#xff1a;and or not 去重&#xff1a;distinct排序&#xff1a;order by截断和偏移…

Linux学习笔记之定时任务调度

crond 任务调度 任务调度&#xff1a;指系统在某个时间执行的特定的命令或程序 任务调度分类&#xff1a;1.系统工作&#xff1a;有些重要的工作必须周而复始地执行&#xff0c;如病毒扫描等。 2.个别用户工作&#xff1a;个别用户可能希望执行某些程序&#xff0c;如对mysql数…

MyBatisPlus 用法详解

文章目录 一、快速入门1.1 引入依赖&#xff1a;1.2 定义 Mappper&#xff1a;1.3 使用演示&#xff1a;1.4 常见注解&#xff1a;1.4.1 TableName:1.4.2 TableId&#xff1a;1.4.3 TableField&#xff1a; 1.5 常见配置&#xff1a; 二、核心功能2.1 条件构造器&#xff1a;2.…

C++ -- 多态与虚函数

多态 概念 多态&#xff08;polymorphishm&#xff09;&#xff1a;通常来说&#xff0c;就是指事物的多种形态。在C中&#xff0c;多态可分为编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09;&#xff0c;这里我们重点讲的是运行时多…

ORU 的 Open RAN 管理平面 (M 平面)

[TOC](ORU 的 Open RAN 管理平面 (M 平面)) ORU 的 Open RAN 管理平面 (M 平面) https://www.techplayon.com/open-ran-management-plane-m-plane-for-open-radio-unit/ ORU M 平面 在 ORAN 中&#xff0c;设置参数的 O-RU 管理功能是通过 M-Plane 完成的。管理功能包括 O-…

使用Go语言编写一个简单的NTP服务器

NTP服务介绍 NTP服务器【Network Time Protocol&#xff08;NTP&#xff09;】是用来使计算机时间同步化的一种协议。 应用场景说明 为了确保封闭局域网内多个服务器的时间同步&#xff0c;我们计划部署一个网络时间同步服务器&#xff08;NTP服务器&#xff09;。这一角色将…

电信网关配置管理系统 upload_channels.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…