Android NDK开发之旅23 C++ 异常处理

###异常处理

与Java类似,C++也有异常处理。

###异常类型

C++中,异常的类型是任意的,如下:

void main(){
	
	try{
		//throw 1;
		//throw "异常信息";
		throw 9.8;
	}
	catch (int a){
		cout << "int异常:" << a << endl;
	}
	catch (char* s){
		cout << "char*异常:" << s << endl;
	}
	catch (...){
		cout << "未知异常"<< endl;
	}

	system("pause");
}
复制代码

throw不同类型的异常,就会在相应的catch块里面捕获到。其中...能够捕获所有类型的异常,catch有先后,如果先捕获到异常,后面的catch块就不会执行了。

###不断向外抛出

异常在函数里面抛出的话,可以一层一层往外抛出,如果最终没有catch到的,程序就会停止。我们可以在函数定义的时候声明抛出的异常的类型列表。

void fun1() throw(char*){
	throw "我是一个异常";
}

void main(){

	try{
		fun1();
	}
	catch (char* s){
		cout << "char*异常:" << s << endl;
	}
	system("pause");
}
复制代码

###C++标准异常与自定义异常

C++提供了一系列标准的异常类,例如下面的out_of_range:

#include <stdexcept>

void fun1() throw(out_of_range){
	throw out_of_range("超出范围");
}

void main(){

	try{
		fun1();
	}
	catch (out_of_range err){
		cout << "out_of_range异常:" << err.what() << endl;
	}
	system("pause");
}
复制代码

我们也可以自定义异常:

自定义的异常需要继承exception类。

class MyException :public exception{
public:
	MyException(char* msg)
		:exception(msg){
		
	}
};

void fun1() throw(MyException){
	throw MyException("自定义异常");
}

void main(){

	try{
		fun1();
	}

	//不适用引用的话,会产生副本
	//catch (MyException err){
	//	cout << "MyException异常:" << err.what() << endl;
	//}

	//推荐这种写法,使用引用就不会产生副本
	catch (MyException &err){
		cout << "MyException异常:" << err.what() << endl;
	}

	system("pause");
}
复制代码

下面这条语句是抛出异常指针:

throw new MyException("自定义异常指针");
复制代码

捕获的时候需要加上指针:

catch (MyException *err){
	cout << "MyException异常:" << (*err).what() << endl;
}
复制代码

但是我们一般不推荐抛出异常指针,因为new出来的类是存在于堆内存的,我们还需要手动去delete。

###抛出内部类的异常

class Err{
public:
	class MyException{
	public:
		MyException(){}
	};
};


void fun1() throw(Err::MyException){
	throw Err::MyException();
}
复制代码

如果觉得我的文字对你有所帮助的话,欢迎关注我的公众号:

我的群欢迎大家进来探讨各种技术与非技术的话题,有兴趣的朋友们加我私人微信huannan88,我拉你进群交(♂)流(♀)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值