异常的基本使用/对自定义异常进行捕获/栈解旋

2.1 try 试图执行 try{}中的内容
2.2 在可能出现异常的地方 抛出异常 throw
2.3 try下面 catch捕获异常
2.4 catch( 捕获类型 ) …代表 所有其他类型
2.5 如果不想处理异常,继续向上抛出 throw
2.6 如果没有任何处理异常的地方,那么成员调用terminate函数,中断程序
2.7 自定义异常类 ,可以抛出自定义的对象 ,捕获自定义的异常
3.1 从try开始 到 throw 抛出异常之前 所有栈上的对象 都会被释放 这个过程称为栈解旋
3.2 栈上对象构造顺序与析构顺序相反

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;

class myException { //自定义异常类
public:
	void printError() {
		cout << "自定义异常" << endl;
	}
};

class Person {
public:
	Person() {
		cout << "构造函数调用" << endl;
	}
	~Person() {
		cout << "析构函数调用" << endl;

	}
};

int myDevide(int a, int b) {
	if (b == 0) {
		//如果b是0 抛出异常
		//throw 1; 抛出int类型异常
		//throw 3.14; //抛出double类型异常  异常必须处理,如果不处理 就挂掉
		
		//栈解旋
		//从try开始  到 throw 抛出异常之前  所有栈上的对象 都会被释放 这个过程称为栈解旋
		//构造和析构顺序相反
		Person p1, p2;

		throw myException(); //匿名对象
	}
	return a / b;
}

void test01() {
	int a = 10;
	int b = 0;

	//int ret = myDevide(a, b); //早期如果返回-1 无法区分到底是结果还是异常
	
	//C++中异常处理

	try {  //试一试
		myDevide(a, b);
	}
	catch(double) {//捕获异常
		//如果不想处理这个异常 ,可以继续向上抛出
		throw;
		cout << "double类型的错误" << endl;
	}
	catch (myException e) {
		e.printError();
	}
	catch (...)
	{
		cout << "其他类型异常捕获" << endl;
	}
}

int main(){
	try{
		test01();
	}
	catch(double) { //如果异常都没有处理,那么成员terminate函数,使程序中断
		cout << "main函数中double类型的错误" << endl;
	}
	catch (...)
	{
		cout << "main函数中 其他类型异常捕获" << endl;
	}
	
	system("pause");
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值