C++11 异常

news2024/11/24 1:58:05

文章目录

  • 🍖异常是什么
    • 🌭概念
    • 🌭实现方式
  • 🍖异常的使用和注意事项
    • 🌭注意事项
    • 🌭异常的重新抛出
    • 🌭异常安全
  • 🍖异常的规范
  • 🍖异常带来的优缺点

🍖异常是什么

🌭概念

在C语言里,我们对可能出现的错误片段都会做相应处理,要么是用if,else语句分类判断,要么就直接使用assert进行报错处理。C++是OOP语言,C++11引入了异常,对可能出错的地方可以进行异常处理,抛出错误对象。以便工作人员快速找出错误,也防止程序因错误而突然终止。

🌭实现方式

异常的使用很简单

void func()
{
	int x, y;
	cin >> x >> y;
	if(y)
		cout << (double)x / (double)y << endl;
	else
		throw "错误!被除数为零";
}
int main()
{
	try
	{
	    func();
	}
	catch (const char* msg)
	{
	    cout << msg << endl;
	}
	catch (const string& msg)
	{
	    cout << msg << endl;
	}
	catch (const std::exception& e)
	{
	    cout << e.what() << endl;
	}
	return 0;
}

try{ } ---------------- 里面放可能出错的语句
catch{ } ------------ 里面编写收到异常对象后的处理方式(注:抛出的异常对象只会对应一个catch)
const std::exception& e ------------ 表示接受抛出异常对象的类型
throw --------------- 表示抛出异常对象

当输入的y为0时,此时就会抛出异常对象给catch(const char* msg)捕捉,因为抛出的是字符串数组。

🍖异常的使用和注意事项

🌭注意事项

异常的抛出和匹配原则

  1. 异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个catch的处理代码
  2. 选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个。
  3. catch(…) 可以捕获任意类型的异常,问题是不知道异常错误是什么
  4. 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch以后销毁。(这里的处理类似于函数的传值返回)。
  5. catch建议一般用父类类型异常对象接收,这样可以运用多态的特性,来实现不同的效果。

在函数调用链中异常栈展开匹配原则

  1. 首先检查throw本身是否在try块内部,如果是再查找匹配的catch语句。如果有匹配的,则调到catch的地方进行处理。
  2. 没有匹配的catch则退出当前函数栈,继续在调用函数的栈中进行查找匹配的catch。
  3. 如果到达main函数的栈,依旧没有匹配的,则终止程序。上述这个沿着调用链查找匹配的catch子句的过程称为栈展开。所以实际中我们最后都要加一个catch(…)捕获任意类型的异常,否则当有异常没捕获,程序就会直接终止。
  4. 找到匹配的catch子句并处理以后,会继续沿着catch子句后面继续执行。
    在这里插入图片描述

🌭异常的重新抛出

如上图,如果在func2中设有catch,但又不想捕获,更希望func3来捕获处理,那么就在func2中再次throw异常,在func3中设catch来捕获。如下示例图:
在这里插入图片描述

🌭异常安全

  • 构造函数完成对象的构造和初始化,最好不要在构造函数中抛出异常,否则可能导致对象不完整或没有完全初始化
  • 析构函数主要完成资源的清理,最好不要在析构函数内抛出异常,否则可能导致资源泄漏(内存泄漏、句柄未关闭等)
  • C++中异常经常会导致资源泄漏的问题,比如在new和delete中抛出了异常导致内存泄漏在lock和unlock之间抛出了异常导致死锁,C++经常使用RAII来解决以上问题。

🍖异常的规范

在这里插入图片描述

这是库里面的异常类(exception类),可见在面对我们开发的需求时,库里的异常类往往不太能满足我们的需要,所以我们会经常自定义异常类,来继承库里的异常类,或者不继承。

🍖异常带来的优缺点

  • 优点
  1. 异常对象定义好了,相比错误码的方式可以清晰准确的展示出错误的各种信息,甚至可以包
    含堆栈调用的信息,这样可以帮助更好的定位程序的bug。
  • 缺点
  1. 异常会导致程序的执行流乱跳,并且非常的混乱,并且是运行时出错抛异常就会乱跳。这会
    导致我们跟踪调试时以及分析程序时,比较困难。
  2. C++没有垃圾回收机制,资源需要自己管理。有了异常非常容易导致内存泄漏、死锁等异常
    安全问题。

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

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

相关文章

jQurey-基本知识点总结

&#xff08;一&#xff09;jQurey基础知识 1、官网下载&#xff1a;jQuery jQurey是一个js文件&#xff0c;直接存到项目文件中&#xff0c;然后跟平常文件js导入一致&#xff1a; <script src"js/jquery-3.7.0.js"></script> 2、jQurey语法 jQure…

邹检验,结构变化识别及其R语言实现

在描述多维数据的维度关系时&#xff0c;线性模型无疑应用最多。然而某些情况下&#xff0c;我们关心随着时间变化或随着样本分组&#xff0c;线性关系的具体参数是否发生了变化&#xff0c;即是否发生结构变化Structural break。邹检验Chow test提供了最基本的一种结构变化显著…

Solaris Network:去中心化金融(DeFi)的未来

近年来&#xff0c;金融世界经历了一场范式转变&#xff0c;区块链技术在实现无障碍和反审计的去中心化金融服务方面发挥了关键作用。在这样的背景下&#xff0c;Solaris Network应运而生&#xff0c;它创建了一个基于Web 3.0技术的去中心化合成资产生态系统。 什么是Solaris N…

制作网上投票链接制作可以投票的链接制作制作一个投票链接

现在来说&#xff0c;公司、企业、学校更多的想借助短视频推广自己。 通过微信投票小程序&#xff0c;网友们就可以通过手机拍视频上传视频参加活动&#xff0c;而短视频微信投票评选活动既可以给用户发挥的空间激发参与的热情&#xff0c;又可以让商家和企业实现推广的目的&am…

FinClip小程序统计能力重磅上线!数据统计分析更精准

不妨让我们看看在本月的产品与市场发布亮点&#xff0c;看看它们如何帮助您实现目标。 产品方面的相关动向&#x1f447;&#x1f447;&#x1f447; 全新版本的小程序统计能力 ​ 全新版本的⼩程序统计功能已经在近期上线了&#xff0c;我们计划在 2023 年 5 ⽉ 23 ⽇的「价…

git fsmonitor--daemon 占用目录,导致无法修改

当我通过命令 git clone 目录然后导入 IDE 操作时&#xff0c;由于想修改目录名&#xff0c;就退了 IDE&#xff0c;再修改目录名&#xff0c;系统提示我文件夹正在使用&#xff1a; 通过 LockHunter (或者PowerToys) 发现占用该目录的进程&#xff0c;右键打开。 打开后如下…

03. 数据结构之链表

前言 链表是相区别于数组的&#xff0c;另一种典型的线性表数据结构。也是学习后面复杂的数据结构的基础&#xff0c;我们后面很多结构比如树&#xff0c;有向图等都可以用链表很方便的存储管理。 1. 概念 链表&#xff08;linked list&#xff09;是一种在物理上非连续、非…

CryoEM - 冷冻电镜 EMPIAR 数据集的下载过程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/130812925 EMPIAR: Electron Microscopy Public Image Archive&#xff0c;电镜公开图像存档。 IBM Aspera Connect 是一款高效的文件传…

如何在两个月内考过软考高级

如何在两个月内考过软考高级 前言本人情况备考经历一些备考关键点考试中结果相关资料获取 前言 高级软考的作用这里不用多说&#xff0c;本人在2022年9月初开始备考&#xff0c;在11月初顺利通过高级系统架构师&#xff0c;期间的经历这里与大家分享一下。本人之前并没有考过其…

使用Jmeter连接MySQL测试实战

01、连接MQSQL数据库 1、jmeter要连接mysql数据库 首先得下载mysql jdbc驱动包&#xff0c;尽量保证其版本和你的数据库版本一致&#xff0c;至少不低于数据库版本&#xff0c;否则可能有问题。 官网下载地址为&#xff1a;https://dev.mysql.com/downloads/connector/j/ 下…

数据结构课程设计——哈夫曼编/译码器

数据结构课程设计任务书 学生姓名&#xff1a; 专业班级&#xff1a;软件工程 指导教师&#xff1a; 工作单位&#xff1a; 题 目: 哈夫曼编/译码器 基础要求&#xff1a; &#xff08;1&#xff09;熟悉各种…

HTML- 标签学习之- 表单

input 系列&#xff0c; 类型根据type 区分&#xff0c;所有效果如下&#xff1a; 注意点&#xff1a; 单/多选框&#xff1a; name &#xff1a; 相同name属性的单选值为一组&#xff0c;遗嘱中只能有一个被选中 checked&#xff1a; 默认选中 性别<i…

stm32的IIC驱动0.96OLED

IIC原理介绍&#xff1a; IIC是一个总线的结构但不支持总线协议 OLED介绍&#xff1a; 一、0.96寸OLED屏幕介绍 本文采用的是4针的0.96寸OLED显示进行讲解&#xff0c;采用的是SPI协议&#xff0c;速度会比采用I2C协议的更快&#xff0c;但这两者的显示驱动都一样&#xf…

AIGC功能在线制作思维导图?

ProcessOn思维导图软件是一款功能强大的在线制作思维导图的工具&#xff0c;它提供了丰富的模板和图标&#xff0c;可以帮助用户快速制作出高质量的思维导图。其中&#xff0c;AIGC(人工智能图形识别)功能是 ProcessOn软件中的一大特色&#xff0c;它可以帮助用户更加高效地制…

permiere的字幕自动转录功能

permiere2022.3后就能够离线字幕转录了&#xff0c;这个是个很好的消息&#xff08;但也要温馨的提示大家&#xff0c;这个功能对于非标注发音或者环境嘈杂的环境下的语音识别很不友好&#xff0c;当然&#xff0c;如果你想利用它来识别歌词&#xff0c;那就乘早死了这条心&…

chatgpt赋能Python-pythonslam

Pythonslam&#xff1a;实现SLAM技术的Python库 在机器人领域&#xff0c;SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;技术是非常重要的。SLAM技术使得机器人能够在未知环境中构建地图并同时确定自己的位置。然而&#xff0c;SLAM算法往往需要强大的计…

Godot引擎 4.0 文档 - 第一个 2D 游戏

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Your first 2D game — Godot Engine (stable) documentation in English 第一个 2D 游戏 在这个循序渐进的教程系列中&#xff0c;您将使用 Godot 创建您的第一个完…

上交清华搞事情!发起最全学科大模型中文知识及推理评测!GPT-4 竟然血洗所有国产模型

夕小瑶科技说 原创 作者 | 小戏&#xff0c;Python 从 OpenAI 的 ChatGPT、Meta 的 LLaMA、Anthropic 的 Claude 到复旦的 Moss、清华的 ChatGlm、MiniMax 的 Glow&#xff0c;国内的国外的大模型百花齐放层出不穷。那么&#xff0c;抛出一个相信大家都会关心的问题&#xff…

网狐大联盟服务端源码分析之服务核心-ServiceCore

工程属性分析: 1.工程属性->动态链接库 2.dll类型->MFC共享DLL 3.字符集->Unicode 4.库导出类型->使用模块定义文件def 5.生成的导出模块函数与对应的地址定义lib文件 源码分析: 头文件分析: 头文件与对应含义表示如下:

开关电源PCB排版基本规则

开关电源PCB排版是开发电源产品中的一个重要过程。许多情况下&#xff0c;一个在纸上设计得非常完美的电源可能在初次调试时无法正常工作&#xff0c;原因是该电源的PCB排版存在着许多问题。 为了适应电子产品飞快的更新换代节奏&#xff0c;产品设计工程师更倾向于选择在市场…