C++的异常处理机制有两个主要成分:异常的识别和发出,以及异常的处理方式。异常出现之后,正常程序的执行被挂起,于此同时,异常处理机制开始搜寻能够处理这一个异常的地点。异常处理完毕之后,程序的执行便会被激活,从异常处理点继续执行下去。
抛出异常,可以抛出整数或字符串,或者自己定义的异常类。
throw 32;
throw "error";
throw my_exception();
int minus(int a, int b) {
if (a < b)
throw "error";
return a - b;
}
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;
}
看来异常应该在何时捕捉处理,何时抛出异常,也是一门学问啊,要在实践过程中慢慢体会~。