c++异常机制(5)-- 继承与异常

我们在c++异常机制(3)中自定义类型,我们将相应的异常封装成了类,在类中实现一些方法,对异常进行处理。其中每一个类都实现了print()方法。

我们使用throw抛出相应异常的虚拟对象,在catch参数中进行匹配,但是如果有很多异常类型,我们就需要写很多的catch进行匹配,能否只写一个catch就可以匹配不同的异常类,并且调用对应的处理函数。 

这就需要我们之前学到的多态(虚函数)了,可以直接将子类赋值给父类,而且在catch中是支持的。 (在c++异常机制(2)中说过了)

所以,我们可以将所有异常类都继承于一个父类,并且在父类中写一些处理异常所用的纯虚函数。(因为在父类中不需要实现,而且父类不需要定义对象,在子类中根据对应子类的需求对继承的纯虚函数进行实现)。

在使用虚函数之后,我们遇到异常之后,抛出对应异常类的匿名对象,然后再catch中使用父类型来捕获,这样接收的那个子类,然后就能调用对应子类的处理函数。 

关于虚函数请看c++多态(2) -- 虚函数

代码:   

#define BUFFER_SIZE 1024class FileError {
public:FileError(int err) :errorData(err) {};virtual void print() = 0;   // 纯虚函数
protected:  // 可以让元素在子类中直接使用int errorData;
};class OpenFileError : public FileError{
public:OpenFileError(int err) :FileError(err) {};void print() override{switch (errorData) {case -1:printf("源文件打开失败 %d\n", errorData);break;case -2:printf("目的文件打开失败 %d\n", errorData);break;}}
};class WriteFileError:public FileError{
public:WriteFileError(int err) :FileError(err) {}void print() override {printf("文件写入失败");}
};// 将一个文件中的内容拷贝到另外一个文件中去
int makeFile(const char* dest, const char* src) {// 定义文件指针FILE* fp1 = NULL, * fp2 = NULL;// 打开文件, 以只读二进制形式打开文件,打开失败返回NULLfp1 = fopen(src, "rb"); // 判断文件是否成功打开if (!fp1) {throw OpenFileError(-1);}// 打开文件,以只写二进制形式打开文件,打开失败返回NULLfp2 = fopen(dest, "wb");// 判断文件是否成功打开if (!fp2) {throw OpenFileError(-2);    //  返回错误标记,表示目标文件打开失败}// 进行文件的拷贝char buffer[BUFFER_SIZE];    // 1024字节的缓存int readLen, writeLen;       // 每次读取的长度和写入的长度// 读取的长度大于0,说明有内容可以写入,执行循环体的写入内容while ((readLen = fread(buffer, 1, BUFFER_SIZE, fp1)) > 0) {writeLen = fwrite(buffer, 1, readLen, fp2);// 如果一次写入的长度和读取的长度不等,那么说明写入失败if (readLen != writeLen) {throw WriteFileError(-1); }}// 关闭文件fclose(fp1);fclose(fp2);return 0;  // 一切正常返回0
}int makeFile2(const char* dest, const char* src) {int ret;ret = makeFile(dest, src);printf("makeFile2 函数被调用");return ret;
}int main(void) {int ret = 0;try {ret = makeFile2("dest.txt", "src.txt");}catch (FileError& error) {error.print();}system("pause");return 0;
}

与前面的代码对比,catch的参数我们只需要写一个就可以匹配所有的异常情况,在异常类型多的情况下,这显然更加的简便。 

 

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

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

相关文章

Springboot项目集成短信验证码(超简单)

操作流程 注册验证码平台创建验证码模版开始集成(无需引入第三方库) 注册并登陆中昱维信验证码平台 获取AppID和AppKey。 创建验证码模版 创建验证码模版,获取验证码模版id 开始集成 创建controller import org.springframework.web.bi…

MATLAB环境下基于随机游走拉普拉斯算子的快速谱聚类方法

古人有云,物以类聚,在面临信息爆炸问题的今天,对信息类别划分的价值日益显现,并逐步成为学者们的研究热点。分类和聚类是数据挖掘的重要工具,是实现事物类别划分的左右手,聚类又是分类一种特殊的方式。所谓…

CodeWhisperer安装教导--一步到位!以及本人使用Whisperer的初体验。

CodeWhisperer是亚马逊出品的一款基于机器学习的通用代码生成器,可实时提供代码建议。类似 Cursor 和Github AWS CodeWhisperer 亚马逊科技的CodeWhisperer是Amazon于2021年12月推出的一款代码补全工具,与GitHub Copilot类似。主要的功能有:代码补全注释…

猫毛过敏养猫人士的必备养猫好物-宠物空气净化器品牌分享

许多猫奴在与猫相处一段时间后突然对猫毛过敏,这真是令人难受。一些人认为对猫咪过敏是因为它们在空气中飘浮的毛发引起的,但实际上大部分人之所以过敏是因为对猫身上一种微小的蛋白质过敏。这种导致过敏的蛋白质附着在猫咪的一些皮屑上。我们都知道猫咪…

前端架构: 脚手架通用框架封装之入口文件开发(教程一)

脚手架入口文件开发 创建脚手架项目: abc-cli $ mkdir abc-cli && cd abc-cli 全局安装 lerna, $ npm i -g lerna 基于 lerna 完成项目初始化 $ lerna init 基于 lerna 创建脚手架 cli $ lerna create cli一路回车 好现在生成了一个 cli 的模板,目前需要…

Qt 中Json的构造和解析简单例子

概述: Qt中使用Json比较方便,不像纯C需要导入CJson RapidJson JsonCpp等第三方的库,主要使用到QJsonDocument、QJsonObject对象即可 1、如何构造一个json字符串 假如我们需要构造 {"cmd":"1001","data":{"content&q…

Linux 下安装Jupyter

pip3 install jupyter pip3 install ipython -------------------------------------------- pip3 install jupyterlab jupyter lab pip3 list | grep jupyterlab 启动: python3 -m jupyter lab 2.安装朱皮特 pip3 install -i https://pypi.douban.com/simpl…

高性能的key-value数据库Redis 介绍

Redis 是一个高性能的key-value数据库。 Redis是一个开源的键值存储系统,通常用于缓存和消息传递。它支持多种类型的数据结构,如字符串、列表、集合、散列表和有序集合等。Redis的特点是提供了高性能、灵活性和可伸缩性。 Redis的主要特点包括&#xff…

Pytorch学习 day02(加载数据)

加载数据 * Dataset提供一种方式:来获取数据及其label,给数据进行编号 * Dataloader为神经网络提供不同的数据形式 Dataset的组织形式有很多种,例如: 将label放在文件夹名上,如下: #Dateset # --train #…

Python算法题集_组合总和

Python算法题集_组合总和 题39:组合总和1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【值传递回溯】2) 改进版一【引用传递堆栈回溯】3) 改进版二【过程值列表缓存遍历后检索】 4. 最优算法5. 相关资源 本文为Python算法题集之一的…

.halo勒索病毒的最新威胁:如何恢复您的数据?

尊敬的读者: 随着科技的发展,网络安全已经成为我们日常生活中不可忽视的重要议题。其中,勒索病毒是当前网络安全威胁中的一大挑战,而“.halo”勒索病毒更是近期备受关注的恶意软件之一。本文将介绍关于“.halo”勒索病毒的背景知…

AI新工具(20240227) StickerBaker文本生成贴纸的工具;Mistral Large;Rewind等

StickerBaker - 基于Replicate和Fly.io技术,100%开源的制作贴纸的工具 StickerBaker是一个基于人工智能的贴纸创作工具,允许用户通过输入特定的提示语句生成独特的贴纸。这个工具使用了Replicate平台来生成贴纸,同时依托于Fly.io作为其基础设…

算法项目外包的收费方式

针对算法研究性项目的收费方式和注意事项,这取决于项目的具体性质、规模和所涉及的技术领域。以下是一些常见的收费方式和需要注意的问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 收…

Python学习DAY09_文件和异常

文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景,而实现数据持久化最直接简单的方式就是将数据保存到文件中。 在 Python 中实现文件的读写操作其实非常简单,通过 Python 内置的 open 函数,我们可以指定文件名、操作模式、编码信…

1552.平衡二叉树

输入格式 第一行包含整数 N,表示总插入值数量。第二行包含 N 个不同的整数,表示每个插入值。 输出格式 输出得到的 AVL 树的根是多少。 数据范围 1≤N≤20 输入样例1: 5 88 70 61 96 120 输出样例1: 70 输入样例2&#xff1a…

商业江湖大揭秘:月入千万与颗粒无收,究竟差了什么?

在商业的浩瀚江湖 英雄豪杰们或乘风破浪、月入千万,或步履蹒跚、颗粒无收,这背后的奥秘究竟何在?是天意难测,还是人为疏忽?是制度的不完善,还是工具的滞后不前?答案就隐藏在你未曾注意的细节之…

公司招嵌入式开发岗位,为什么感觉一年比一年难?

最近看到一个问题: 是一个HR在吐槽招不到嵌入式开发的人才。 这句话,难免会误导一些想入行嵌入式的同学,卧槽,这么缺人?赶紧冲! 哼次哼次学完一堆技术栈,一投简历,一个面试机会都没有。 这就是…

24路电磁锁主板在智能存储系统中的作用

在无人值守场景中,如自助服务机、智能生鲜柜、共享储物柜等,使用24路电磁锁主板可以集成身份识别技术,将用户的验证结果转化为相应的开锁动作,提升用户体验和运营效率,是实现智能存储系统高效、安全和自动化运行的关键…

Kubernetes的五大开源存储项目

在Kubernetes中,关于数据的持久化管理是一种挑战,对此,社区提供了多种存储的解决方案,这些方案旨在简化和优化容器化应用程序的持久化数据管理。 现介绍 Kubernetes 的五大开源存储项目,带你了解开源存储解决方案的多…

unity后期

unity|后处理篇 前言一、Post-Processing 1、 Post-Processing的使用2、Post-Processing后处理效果 抗锯齿①、Ambient Occlusion 环境光遮蔽②、Auto Exposure 自动曝光③、Bloom 辉光/泛光④、Chromatic Aberration | 色差⑤、Color Grading 色调/颜色分级⑥、Depth Of Fiel…