C++异常之五 异常和继承
异常和继承
异常也是类,我们可以创建自己的异常类,在异常中可以使用(虚函数,派生,引用传递和数据成员等),
下面用一个自制的数组容器Vector,在对Vector初始化时来对Vector的元素个数进行有效检查。以此来说明继承与异常的使用关系。
运行下方代码,Vector对象传不同参数进去,会触发相应的异常的条件:
1) size < 0 抛出异常 errNegativeException 类
2) size = 0 抛出异常 errZeroException 类
3) size > 1000 抛出异常 errTooBigException 类
4) size < 10 抛出异常 errToosmallException 类
5) errSizeException 类是以上的父类,定义 virtual void printError() const 的虚函数,以多态的形式来输出错误。
1 #include <iostream>
2
3 using namespace std;
4
5 //errSizeException 父类
6 class errSizeException
7 {
8 public:
9 errSizeException(int size)
10 {
11 m_size = size;
12 }
13 virtual void printError()const //虚函数实现多态
14 {
15 cout << "errSizeException size:" << m_size << endl;
16 }
17
18 protected:
19 int m_size = 0;
20 };
21
22 //index < 0 抛出异常 errNegativeException 类
23 class errNegativeException :public errSizeException
24 {
25 public:
26 errNegativeException(int size) :errSizeException(size) {} //使用初始化列表对子类初始化
27 const virtual void printError()
28 {
29 cout << "errNegativeException size:" << m_size << endl;
30 }
31 };
32
33 //index = 0 抛出异常 errZeroException 类
34 class errZeroException :public errSizeException
35 {
36 public:
37 errZeroException(int size) :errSizeException(size) {} //使用初始化列表对子类初始化
38 const virtual void printError()
39 {
40 cout << "errZeroException size:" << m_size << endl;
41 }
42 };
43
44 //index > 1000 抛出异常 errTooBigException 类
45 class errTooBigException :public errSizeException
46 {
47 public:
48 errTooBigException(int size) :errSizeException(size) {} //使用初始化列表对子类初始化
49 const virtual void printError()
50 {
51 cout << "errTooBigException size:" << m_size << endl;
52 }
53 };
54
55 //index < 10 抛出异常 errToosmallException 类
56 class errToosmallException :public errSizeException
57 {
58 public:
59 errToosmallException(int size) :errSizeException(size) {} //使用初始化列表对子类初始化
60 const virtual void printError()
61 {
62 cout << "errToosmallException size:" << m_size << endl;
63 }
64 };
65
66
67 class Vector
68 {
69 public:
70 Vector(int szie); //带参构造函数
71 ~Vector() //析构函数
72 {
73 if (m_base)
74 {
75 delete[] m_base;
76 m_len = 0;
77 }
78 }
79
80 int getLength() //获取内部储存元素的个数
81 {
82 return m_len;
83 }
84
85 int& operator[](int index) //下标重载
86 {
87 return m_base[index];
88 }
89 private:
90 int* m_base = NULL; //存储空间指针
91 int m_len = 0; //长度
92 };
93
94 Vector::Vector(int len)
95 {
96 if (len < 0)
97 {
98 throw errNegativeException(len); //抛出临时对象,带有长度参数进行构造
99 }
100 else if (len = 0)
101 {
102 throw errZeroException(len); //抛出临时对象,带有长度参数进行构造
103 }
104 else if (len > 1000)
105 {
106 throw errTooBigException(len); //抛出临时对象,带有长度参数进行构造
107 }
108 else if (len < 10)
109 {
110 throw errToosmallException(len); //抛出临时对象,带有长度参数进行构造
111 }
112 m_len = len;
113 m_base = new int[m_len];
114 }
115
116
117 int main()
118 {
119 try
120 {
121 Vector _V(-1); //传:-1、0、1001、1 四个参数进去,会抛出四个异常
122
123 for (int i = 0; i < _V.getLength(); i++)
124 {
125 _V[i] = i + 10;
126 printf("_V[%d]:%d\n", i, _V[i]);
127 }
128 }
129 catch (const errSizeException& err) //父类,由多态特性与其子类进行匹配
130 {
131 err.printError();
132 }
133
134 return 0;
135 }
1. 异常处理的三个关键字
2. 异常处理的基本语法
3.异常处理接口声明
4.异常类型的生命周期
4.1 throw 基本类型:
4.2 throw 字符串类型:
4.3 throw 类类型异常:
5.异常和继承
6.异常处理的基本思想
7.标准库里的异常类
C++异常之五 异常和继承的更多相关文章
- Java异常处理-----非运行时异常(受检异常)
非运行时异常(受检异常) 如果出现了非运行时异常必须进行处理throw或者try{}catch(){}处理,否则编译器报错. 1:IOException 使用要导入包import java.io.IO ...
- 各种异常 及异常类和Object类 Math类
Day05 异常 Object类 equals方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较.Object类中的equals方法内部使用的就是==比较运算符. 2. 描述人这个 ...
- Python档案袋(异常与异常捕获 )
无异常捕获 程序遇到异常会中断 print( xxx ) print("---- 完 -----") 得到结果为: 有异常捕获 程序遇到异常会进入异常处理,并继续执行下面程序 tr ...
- 两种异常(CPU异常、用户模拟异常)的收集
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 两种异常(CPU异常.用户模拟异常)的收集 文章的核心:异常收集 ...
- 重学c#系列——异常续[异常注意事项](七)
前言 对上节异常的补充,也可以说是异常使用的注意事项. 正文 减少try catch的使用 前面提及到,如果一个方法没有实现该方法的效果,那么就应该抛出异常. 如果有约定那么可以按照约定,如果约定有歧 ...
- 异常概念&异常体系和异常分类
异常概念 异常:指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象.Java处 ...
- 各种异常 及异常类和Object类
Day05 异常 Object类 equals方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较.Object类中的equals方法内部使用的就是==比较运算符. 2. 描述人这个 ...
- Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法
在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论 ...
- 牛客网Java刷题知识点之什么是异常、异常处理的原理是什么、为什么要使用异常、异常体系、运行时异常、普通异常、自定义异常、异常链
不多说,直接上干货! 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失.同样的道理,计算机的世界也是不完美的,异常情况随时都会发 ...
随机推荐
- 环境安装和pycharm中一些基本设置
一.Pycharm的使用和Python环境 1.python和pycharm的安装 python推荐版本3.7/3.8 pycharm选择社区版本 查看python版本在cmd中输入"pyt ...
- python-网络安全编程第十天(web目录扫描&&fake_useragent模块&&optionParser模块)
前言 昨天的内容没有完成今天花了点时间继续完成了 感觉自己的学习效率太低了!想办法提高学习效率吧 嗯 ,再制定下今天的目标 开始健身. python fake_useragent模块 1.UserAg ...
- beef抓包简析
搭建完了beef就想简答的抓下包分析下 这是第一个包,追踪它 返回demo页面,并发现其中的脚本 window.location.protocol表示协议http, window.location.h ...
- 痞子衡嵌入式:揭秘i.MXRT600的ISP模式下用J-Link连接后PC总是停在0x1c04a的原因(Debug Mailbox)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT600中的Debug Mailbox实现对JLink调试的影响. 事情缘起痞子衡的同事 - 喜欢打破砂锅问到底的Kerry小 ...
- ABBYY FineReader 15新增编辑页面布局功能
ABBYY FineReader 15(Windows系统) 新增编辑页面布局功能,允许用户修改PDF数字文档的页面布局,包括添加或者删除文字段落,文字块以及图片,更改段落,文字块,图片位置.添加或者 ...
- selenium元素定位不到问题分析及解决办法
最近正在学习写自动化测试脚本,遇到一个错误迟迟未解决,导致自信心大受挫败,甚至想放弃. 思考许久突然想到,我遇到的问题是否也有人会遇到,如果有的话问题就应该有解决办法了.没什么问题是百度解决不了的,如 ...
- 自学linux——12.shell进阶
Shell进阶 当把在Windows中写好的脚本传到linux中使用时,在Windows下每一行结尾是\n\r,而Linux下则是\n,所以会多出来\r,在linux中运行脚本时,需执行: sed - ...
- 关于Linux虚拟机连接不上网络的问题
前阵子自学Linux(版本是CentOS6 -VMware ),因为连不上网的问题搁置了一段时间,昨天又重新拾起来,花了一下午时间终于搞定.下面说几点,给自己学习历程一个记录,也希望能帮到其他初学者. ...
- P2943 [USACO09MAR]Cleaning Up G
一句话题意:将一个数列分成若干段,每段的不和谐度为该段内不同数字数量的平方,求不和谐度之和的最小值. 令 \(f_i\) 表示前 \(i\) 个数的最小答案,很容易就能写出暴力转移方程:\(f_i=\ ...
- 洛谷 P1284 三角形牧场 题解(背包+海伦公式)
题目链接 题目大意 给你 n块木板(n<=40),每块木板长度为\(l[i]<=40\) 每块木板都要用,求最大的三角形面积×100,答案直接舍去小数 题目思路 首先如果已知三条边的长度可 ...