C++回顾(十六)—— 异常处理机制
16.1 异常的基本语法

- 1) 若有异常则通过throw操作创建一个异常对象并抛掷。
- 2) 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。
- 3) 如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。
- 4) catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。
- 5) 如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序。
- 6)处理不了的异常,可以在catch的最后一个分支,使用throw语法,向上扔。
- 7)异常机制与函数机制互不干涉,但捕捉的方式是基于类型匹配。捕捉相当于函数返回类型的匹配,而不是函数参数的匹配,所以捕捉不用考虑一个抛掷中的多种数据类型匹配问题
- 8)异常捕捉严格按照类型匹配


完整示例代码:
#include <iostream>using namespace std;int Div(int x, int y)
{if (0 == y){//return -1;//throw 0; //抛出异常throw 'a';}return x / y;
}int main()
{int a, b;cin >> a >> b;try { //把可能抛出异常的代码放在try语句中cout << Div(a, b) << endl;}catch(int) // throw 0;{cout << "zero exception" << endl;}catch(char) // throw 'a'{cout << "char exception" << endl;}return 0;
}
运行结果:

16.2 异常处理的基本思想
16.2.1 传统的错误处理机制:通过函数返回值处理错误
例如常见的:return -1;
16.2.2 异常处理思想
- 1)C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理。
- 2)异常是专门针对抽象编程中的一系列错误处理的,C++中不能借助函数机制,因为栈结构的本质是先进后出,依次访问,无法进行跳跃,但错误处理的特征却是遇到错误信息就想要转到若干级之上进行重新尝试,如图

- 3)异常超脱于函数机制,决定了其对函数的跨越式回跳。
- 4)异常跨越函数

完整示例代码:
#include <iostream>using namespace std;int DDiv(int x, int y)
{if (0 == y){throw 0; // 可以跨越函数,不用在他的上一级语句判断函数返回值}return x / y;
}int Div(int x, int y)
{/*int ret = DDiv(x, y);if (0 == ret){ }else{}*/return DDiv(x, y);
}int main()
{int a, b;cin >> a >> b;try{ //把可能抛出异常的代码放在try语句中cout << Div(a, b) << endl;}catch(int){cout << "zero exception" << endl;}catch (char){cout << "char exception" << endl;}return 0;
}
运行结果:

16.3 异常接口声明
-
1)为了加强程序的可读性,可以在函数声明中列出可能抛出的所有异常类型,例如:
void func() throw (A, B, C , D);//这个函数func()能够且只能抛出类型A B C D及其子类型的异常。 -
2)如果在函数声明中没有包含异常接口声明,则次函数可以抛掷任何类型的异常,例如:
void func(); -
3)一个不抛掷任何类型异常的函数可以声明为:
void func() throw(); -
4) 如果一个函数抛出了它的异常接口声明所不允许抛出的异常,unexpected函数会被调用,该函数默认行为调用terminate函数中止程序。


完整示例代码:
#include <iostream>using namespace std;int Div(int x, int y) throw(int, char); //只能抛出整形或者字符型异常
//int Div(int x, int y) throw(); //不会抛出任何类型异常
//int Div(int x, int y); //可能抛出任何类型的异常int main()
{int a, b;cin >> a >> b;try{ //把可能抛出异常的代码放在try语句中cout << Div(a, b) << endl;}catch(int){cout << "zero exception" << endl;}catch (char){cout << "char exception" << endl;}return 0;
}int Div(int x, int y) throw(int, char)
{if (0 == y){//return -1;//throw 0; //抛出异常throw 'a';}return x / y;
}
运行结果:

16.4 异常类型和异常变量的生命周期
16.4.1 传统处理错误
16.4.2 throw int类型异常
16.4.3 throw字符类型异常
16.4.4 throw类对象类型异常


完整示例代码:
#include <iostream>using namespace std;class Test
{
public:Test(){ cout << "Test构造函数" << endl;}Test(const Test &t){cout << "Test拷贝构造函数" << endl;}void print(){cout << "Test Exceotion" << endl;}~Test(){cout << "Test析构函数" << endl;}
};int Div(int x, int y)
{if (0 == y){throw Test(); //抛出对象//throw new Test; //抛出对象指针}return x / y;
}int main()
{int a, b;cin >> a >> b;try{ //把可能抛出异常的代码放在try语句中cout << Div(a, b) << endl;}catch(int){cout << "zero exception" << endl;}catch (char){cout << "char exception" << endl;}/*catch (Test t) //调用拷贝构造函数{t.print();}*/catch (Test &t) //抛出对象,通过引用来接(推荐){ t.print();}catch (Test *t){t->print();delete t; //需要手动释放}return 0;
}
运行结果:

16.5 标准程序库异常


示例代码:
#include <iostream>
#include <exception>using namespace std;int main()
{try{int *p = new int[-1];}catch (exception &e){cout << e.what() << endl;}return 0;
}
运行结果:

相关文章:
C++回顾(十六)—— 异常处理机制
16.1 异常的基本语法 1) 若有异常则通过throw操作创建一个异常对象并抛掷。2) 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。3) 如果在保护段执行期间没有引起异常…...
【100个 Unity实用技能】 | Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案ÿ…...
哈希表的实现
哈希表概念 二叉搜索树具有对数时间的表现,但这样的表现建立在一个假设上:输入的数据有足够的随机性。哈希表又名散列表,在插入、删除、搜索等操作上具有「常数平均时间」的表现,而且这种表现是以统计为基础,不需依赖…...
搞懂海明码
海明码搞懂之前先了解奇偶校验。例如:1111 对其进行奇偶校验。 奇检验:11111 奇校验使1的个数保持在奇数 偶校验:01111 偶校验使1的个数保持在偶数 海明码可以拆分为三步: 一、确定校验的位数 公式:2^k > k n …...
数据库:Mysql数据库安装及使用
目录 一、数据库介绍 1、基本概念 2、数据库类型 3、版本演变 二、Mysql安装 1、官网下载yum安装 2、手动配置yum安装 三、Mysql基本操作 1、登录与改密 2、检测数据库健康 3、 库的创建与使用 4、数据类型 5、修饰符 6、表的创建与使用 7、分组查询 8、查询排…...
【冲刺蓝桥杯的最后30天】day7
大家好😃,我是想要慢慢变得优秀的向阳🌞同学👨💻,断更了整整一年,又开始恢复CSDN更新,从今天开始更新备战蓝桥30天系列,一共30天,如果对你有帮助或者正在备…...
REG.EXE修改注册表-解决win10微软输入法默认中文,将其全局修改为英文
REG.EXE修改注册表-解决win10微软输入法默认中文,将其全局修改为英文 使用REG.EXE 可以直接强制修改注册表字段 修改注册表: REG.EXE ADD 注册表路径 /v 注册表项字段 /t 注册表字段类型 /d 注册表值 /f 例如: REG. EX ADD HKLM\System\C…...
hive之正则函数研究学习regex/regex_replace/regex_extract
首先学习这个之前要先知道一些正则的基本知识。 随便百度一下正则表达式 – 元字符 | 菜鸟教程 字符描述\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,n 匹配字符 "n"。\n 匹配一个换行符。序列 \\ 匹…...
Codeforces Round 854 by cybercats (Div. 1 + Div. 2) C、D1
C. Double Lexicographically Minimum 题意 字符串sss,你可以把它按任意顺序组合,保留的是你组合的字符串和它的倒序之间大的那一个,问你在满足上面条件的前提下字典序最小的字符串。 思路 分析不难发现在没达到一个关键的点的时候肯定是…...
API 网关日志的价值,你了解多少?
本文介绍了 API 网关日志的价值,并以知名网关 Apache APISIX 为例,展示如何集成 API 网关日志。 作者钱勇,API7.ai 技术工程师,Apache APISIX Committer。 原文链接 网关日志的价值 在数字化时代,软件架构随着业务成…...
华大单片机、STM32单片机如何做printf串口打印格式化输出
第一种方法:使用标准C库,但使用标准C库你必须关闭半主机模式(1)添加下面代码就是关闭半主机模式/* 告知连接器不从C库链接使用半主机的函数 */ #pragma import(__use_no_semihosting)/* 定义 _sys_exit() 以避免使用半主机模式 */…...
unity 面试汇总
1、什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的行为。2、Unity3D中的碰撞器和触发器的区别ÿ…...
Spring SpringBoot中使用Mybatis-plusDemo1
官网:https://baomidou.com GitHub:GitHub - baomidou/mybatis-plus: An powerful enhanced toolkit of MyBatis for simplify development Gitee:mybatis-plus: mybatis 增强工具包,简化 CRUD 操作。 文档 http://baomidou.com低代码组件库 http://aizuda.com My…...
【18.04Ubuntu中解决无法识别显示屏】
【18.04Ubuntu中解决无法识别外接显示屏】1. 问题来源2. 检查Ubuntu是否识别出外接显示器3. 解决没有识别出外接显示器问题4. 显示器扩展屏幕设置1. 问题来源 实验室的一个dell显示器,通过HDMI连接电脑后,在Windows上连接上就直接可以使用了。由于我电脑…...
Python 协程详解,都在这里了
什么是协程 协程(co-routine,又称微线程、纤程) 是一种多方协同的工作方式。 协程不是进程或线程, 其执行过程类似于 Python 函数调用, Python 的 asyncio 模块实现的异步IO编程框架中, 协程是对使用 asy…...
百家号如何写文章赚钱,百家号写文章真的赚钱?
随着互联网的快速发展,越来越多的人开始关注到写文章赚钱这个领域。而在众多写作平台中,头条号无疑是最受欢迎的一个。那么,百家号写文章赚钱是真的吗?如何写文章赚钱呢?下面我们就来一一解答。 首先,百家号…...
【HDFS】datanodeReport RPC优化
cat datanodeReport.txt | awk ‘{print $8}’ | sort | uniq | wc -l 结果15,说明我们有15个router。 每15秒一个router8次调用这个rpc。15秒是我们的监控采集间隔。 看下router为什么要调用这个rpc。 顺着这个配置项去寻找:dfs.federation.router.dn-report.time-out 一…...
【数据结构】研究链表带环问题
💯💯💯💯 本篇主要研究的是链表带环问题,快慢指针的应用,分析不同解法对带环链表的处理,梳理完本篇你将对链表的理解更加透彻Ⅰ.研究链表带环问题Ⅱ.扩展带环问题1.为什么慢指针和快指针一定会相…...
数据仓库的设计思想
数据仓库设计 知识点01:设计大纲与学习目标 #内容大纲1、数据仓库基础知识(回顾)什么是数仓为什么有数仓数仓的特点是什么OLTP和OLAP系统区别(数据库和数仓的区别)2、数仓系统的架构与核心流程核心1:ETL核…...
【JavaSE】数组的定义与使用详解
目录 1.数组的基本概念 1.1数组的好处 1.2什么是数组 1.3数组的定义及初始化 1.3.1数组的创建 1.3.2数组的初始化 1.4数组的使用 1.4.1访问数组中的元素 1.4.2遍历数组 2.数组的类型 2.1认识JVM的内存分布 2.2基本类型变量与引用类型变量 2.3认识null 3.数组的应…...
5分钟制作Windows启动盘:Rufus免费工具终极指南
5分钟制作Windows启动盘:Rufus免费工具终极指南 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 还在为系统重装而烦恼吗?Rufus作为一款完全免费的USB格式化工具࿰…...
PySceneDetect终极指南:5分钟掌握智能视频场景检测与分割
PySceneDetect终极指南:5分钟掌握智能视频场景检测与分割 【免费下载链接】PySceneDetect :movie_camera: Python and OpenCV-based scene cut/transition detection program & library. 项目地址: https://gitcode.com/gh_mirrors/py/PySceneDetect PyS…...
便携激光云高仪:精确测量云底高度、云层厚度等关键参数
便携激光云高仪是一种用于测量云层高度、厚度及分布情况的气象观测设备,广泛应用于气象监测、航空安全、环境研究等领域。其便携式设计特别适合野外作业和临时观测需求。设备通过激光脉冲探测云底高度,并实时分析云层垂直结构,为气象预报、灾…...
【架构师老王】AI真的在“杀死”软件吗?从系统烟囱到Agent时代的非侵入式重构
摘要 近期,“AI杀死软件”的论调在硅谷和国内技术圈闹得沸沸扬扬。作为一名在企业架构领域摸爬滚打15年的老兵,我见证了从单机版到SOA,再到微服务与云原生的每一次浪潮。客观来讲,AI杀死的并不是“软件”本身,而是那些…...
别再乱填了!手把手教你配置Keil的IROM1和IRAM1,让STM32程序跑得更稳
深度解析Keil内存配置:从原理到实战的STM32开发指南 当你第一次在Keil MDK的"Target"选项卡中看到IROM1和IRAM1的配置项时,是否感到困惑?这些看似简单的地址和大小设置,实际上关系到整个嵌入式系统的稳定运行。许多开发…...
Nemo文件管理器终极指南:Cinnamon桌面环境下的高效文件管理神器
Nemo文件管理器终极指南:Cinnamon桌面环境下的高效文件管理神器 【免费下载链接】nemo File browser for Cinnamon 项目地址: https://gitcode.com/gh_mirrors/ne/nemo Nemo是Cinnamon桌面环境的官方文件管理器,作为一个免费开源的软件项目&#…...
安全第一:OpenClaw+GLM-4.7-Flash的本地化数据处理方案
安全第一:OpenClawGLM-4.7-Flash的本地化数据处理方案 1. 为什么我们需要本地化AI解决方案 上个月我帮一位律师朋友处理合同审查任务时,遇到了一个棘手问题——他需要分析上百份涉及商业机密的文件,但担心使用云端AI服务会导致数据泄露。这…...
Python内存泄漏分析实战指南(生产环境零停机排查全流程)
第一章:Python内存泄漏的本质与危害Python内存泄漏并非源于C语言中常见的“未释放malloc内存”,而是指对象被意外长期持有,导致垃圾回收器(GC)无法将其回收,从而持续占用堆内存。其本质是**引用关系的非预期…...
跨平台终端工具cmatrix:打造震撼的数字雨可视化效果
跨平台终端工具cmatrix:打造震撼的数字雨可视化效果 【免费下载链接】cmatrix Terminal based "The Matrix" like implementation 项目地址: https://gitcode.com/gh_mirrors/cm/cmatrix 你是否曾幻想过在自己的终端中重现《黑客帝国》里令人着迷的…...
Pixel Fashion Atelier实操手册:批量生成时利用CSV导入多组Enchantment参数
Pixel Fashion Atelier实操手册:批量生成时利用CSV导入多组Enchantment参数 1. 引言:为什么需要批量生成功能 在时尚设计领域,设计师经常需要快速生成多个不同风格的服装设计方案。传统方式需要逐个输入参数、等待生成、再调整参数…...
