简介C++ 异常处理

C++的异常处理机制有两个主要成分:异常的识别和发出,以及异常的处理方式。异常出现之后,正常程序的执行被挂起,于此同时,异常处理机制开始搜寻能够处理这一个异常的地点。异常处理完毕之后,程序的执行便会被激活,从异常处理点继续执行下去。

抛出异常,可以抛出整数或字符串,或者自己定义的异常类。

throw 32;

throw "error";

throw my_exception();


int minus(int a, int b) {
	if (a < b)
		throw "error";
	return a - b;
}


捕获异常则使用try{}catch[]块来捕获异常
bool my_f() {
	bool status = true;
	try {
		//.....
	} catch ( int errno) {
		log(errno);
		status = false;
	}
	return status;
}

自定义异常类的抛出和捕获:

class over_flow {
public:
	over_flow(int index, int max_elem) : _index(index),_max_elem(max_elem){}
	void what_happend() {
		cerr << "index : " << _index << " is greater than max_elem : " << _max_elem;
	}
private:
	int _index;
	int _max_elem;
}

void check() {
	try {
		throw over_flow(5,3);
	} catch (over_flow &of) {
		of.what_happend();
	}
}


异常可以在函数中使用try{}catch{}捕获处理,也可以向上抛出,让调用此函数者去处理。此时我们就应该在最清楚应该如何处理这个异常的地方处理异常。举个不太恰当的例子:

MyObject* getObject() {
	MyObject* o = NULL; 
	try {
		o = new MyObject();
	} catch ( bad_alloc) {
		cerr << "alloc error";
	}
	return o;
}

bool bussiness() {
	bool status = true;
	try {
		MyObject* o = getObject();
		//...
	} catch ( bad_alloc ) {  //这里的异常已经在getObject处理了,捕获不到了。
		//.....获取对象失败,这里想做一些业务上的特殊处理 。
		status = false;
	}
	return status;
}
bussiness对于这一异常(getObject()失败的异常)在程序执行过程中的重要性最是清楚。所以我们应该在这里捕捉处理。所以getObject()应该以抛出异常的形式来表现错误,而不是直接处理他不抛出。改成这样:

MyObject* getObject() {
	MyObject* o = NULL; 
	try {
		o = new MyObject();
	} catch ( bad_alloc &ba) {
		log("getObject error");
		throw ba;
	}
	return o;
}

看来异常应该在何时捕捉处理,何时抛出异常,也是一门学问啊,要在实践过程中慢慢体会~。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值