C++基础之——异常

 异常

        在学习异常之前,我们先来举一个例子:假设有个数组vec[5],不难看出,数组中有5个元素,当我们访问vec[9]的时候,系统会提示错误——访问越界程序就会停止,那么下面的代码也就不会执行到了。

        那么如果我们面临一个项目来说,这个项目中有一个小的功能出错了,如果这个错误不影响其他功能,那么我们可以选择——异常

        用一种简单易懂的方式形容异常就是:这个函数throw(抛出)了一个异常对象,那么紧接着下面会捕获这个异常对象,如果捕获到了这个异常对象,那么会发出一些信息来提醒这个部分出现了异常,如果没有捕获到异常对象,则不会采取任何操作,这样不管是否有没有异常,下面的代码还是会正常运行。

异常体系

首先我们先来介绍一下C++标准库中的异常体系:

exception是所有异常类型的基类,我们可以用exception类型接收所有异常类型,来实现父类指针或引用指向子类对象,从而实现多态。

下面我们来看一个异常举例:

#include<iostream>
using namespace std;
#include<vector>
//exception 类型是所有异常类型的 基类,可以用exception类型的指针或者引用来指向其他异常类型对象,来实现多态
//try抛出异常 catch接受异常 接受异常之后程序继续进行 异常继续
int main() {
	vector<int> vec;
	try {									
		vec.at(4);
	}
	catch (out_of_range& e) {
		cout << '1' << endl;
		cout <<e.what() << endl;	//invalid vector subscript
	}
	catch (exception& e) {          //当存在两个catch时执行第一个,当用exception异常类型时,实现多态
		cout << '2' << endl;
		cout << e.what() << endl;
	}
	cout << "异常继续" << endl;
	return 0;
}

        下面来解释一下上述代码:vector中的at函数就是检测括号中的数值是否是越界的,如果越界就会抛出out_of_range异常信号,上述代码中抛出out_of_range异常信号之后,下面的第一个catch函数中的参数为out_of_range类型的引用,则会执行catch中的代码;而第二个catch函数中的参数为exception类型的引用,exception类型是所有异常类型的父类,则在代码e.what()中会实现多态——重写。当异常被一个catch接收到之后,下面的catch就不会接收了,下面的代码会正常进行。

异常类

下面我们来实现一个异常类:

#include<iostream>
#include<string>
using namespace std;
class MyException {
private:
	string msg;
public:
	MyException(string str) :msg(str) {}
	MyException(const MyException& other) {
		this->msg = other.msg;
		cout << "拷贝构造函数" << endl;
	}
	void what() {
		cout << msg << endl;
	}
};
int fun(int a, int b) {
	if (b == 0) {
		MyException m("-----异常:除数不能为0-----");//创建对象
			throw m;
	}
	cout << "函数抛出异常就会被结束" << endl;
	return a / b;
}
int main() {
	try {
		fun(1, 0);
	}
	catch (MyException& e) {
		e.what();
	}
	cout << "程序继续执行没有被终止" << endl;
	return 0;
}

下面是代码流程图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coke_3.2.2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值