C++学习笔记(四十) 异常处理

本文介绍了 C++ 中的异常处理机制,包括如何定义自定义异常类、如何使用 try-catch 语句捕获异常以及如何声明可能抛出的异常类型。通过示例代码详细解释了异常处理的基本用法。

1 c++可以抛出各种类型的异常,若要自己抛出,还是推荐继承exception类,重载what函数。  不推荐像我这样抛出 int float等。

2 抛出异常的函数 最好写上抛出异常声明,throw() ,括号里写抛出类型,不写throw表示可能抛出任何类型异常,空括号表示不抛

3 throw的异常只能由其try对应的catch捕获。若没捕获则抛给上层函数来捕获,catch中抛出的也会交给上层catch捕获。

若异常抛给内核则出错,所以一般main中写catch(...)来捕获任何异常。

4 捕获异常后函数无法恢复,会跳到catch后面的语句执行。

5 抛出的异常可能是个临时变量,会等到异常处理完毕后销毁。



#include <iostream>
#include  <exception>
#include <cstdio>

using namespace std;
class MyType {};
//抛异常时最好自定义异常类型 继承exception类 重写what函数

class MyException : public exception
{
public:
	//用来报错时显示异常信息
	const char* what() const throw()
	{
		return "我的异常";
	}
};

class ME : public exception
{
	char msg[100];
public:
	ME(int n)
	{
		sprintf(msg,"在第%d行捕获到异常",n);
	}
	const char* what() const throw()
	{
		return msg;
	}
};


void f() throw(MyException,int,double,const char*,MyType) //异常声明,可能抛出的异常类型。不声明就一切都有可能。 空括号表示不会抛出异常
{
	cout << "请输入一个整数 1- 5" << endl;
	int n;
	cin >> n;
	if(n == 1) throw MyException(); // 异常即使是个临时对象 也会保留到被处理后才释放
	if(n ==2 ) throw MyType();
	if(n == 3) throw "hello";
	if( n == 4) throw 123;
	if(n == 5) throw 123.45;
	cout << "-------------the end of f() ----------------" <<endl; //抛出异常时 这个不会执行

}

void g()
{
	try
	{
		f();
		cout << "the end of g()" << endl;
	} 
	//异常是不可恢复的 一旦出现异常 会执行相应catch语句 跳过不符合的catch
	//然后往catch后面执行
	//抛出的异常如果没捕获,程序运行出错终止
	catch(const char* e){ cout << "const char *" << e << endl;} //字符串常量
	catch(double e) { cout << "double " << e << endl; throw;}//再次抛出  不会执行endof g()
	catch(MyException &e) {cout << e.what() << endl; }	
	catch(exception &e) {cout << e.what() << endl;} //标准库里抛出的异常类型都是exception的子类
	//尽量保证自定义的异常 继承自exception
	
	//捕获任意异常,如果用catch(...)一定是最后一个
	//catch(...){cout << "g()其他异常" << endl;throw ME(__LINE__);} //throw;表示将当前异常重新抛出
	//__LINE__ 行号
	//每个catch 只处理它对应的try()  不能处理同级的catch抛出的异常
	
	//没有捕获的异常向上层传  
	
	
}


int main() 
{

	try
	{
		g();
	} 
	//异常是不可恢复的 一旦出现异常 会执行相应catch语句 跳过不符合的catch
	//然后往catch后面执行
	//抛出的异常如果没捕获,程序运行出错终止
	catch(const char* e){ cout << "const char *" << e << endl;} //字符串常量
	catch(double e) { cout << "double " << e << endl;}
	catch(MyException &e) {cout << e.what() << endl; }	
	catch(exception &e) {cout << e.what() << endl;} //标准库里抛出的异常类型都是exception的子类
	//尽量保证自定义的异常 继承自exception
	
	//捕获任意异常,如果用catch(...)一定是最后一个 main函数中一般用一个catch(...) 不往内核抛
	//
	catch(...){cout << "main其他异常" << endl;}
	
	cout << "-------------the end of main() ----------------" <<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值