1、抛出异常
异常处理机制有两个主要成分:异常的鉴定与发出、以及异常的处理方式。
C++通过throw表达式产生异常:
if(_index>Triangular::_max_elems){
iterator_overflow ex(_index,Triangular::_max_elems);
throw ex
}
2、捕获异常
利用单条或多个catch子句来捕获被抛出的异常对象。catch子句由三部分组成:关键字catch、小括号内的一个类型或对象、大括号内的一组语句(用以处理异常)
bool func(){
bool status=true;
//...假设我们已经抵达此处
catch(int errno){
log_msg(errno);
status=false;
}
catch(const char *str){
log_msg(str);
status=false;
}
return status;
}
异常对象的类型会被拿来逐一地和每个catch子句对比。如果类型符合,那么该catch子句的内容被执行。
如果想要捕获任何类型的异常,可以一网打尽的方式,如下:
catch(...){
log_msg("unknown type");
}
C++规定,每个异常都应该被处理。因此,如果在main函数找不到合适的处理程序,便调用标准库函数terminate()——其默认行为是中断整个程序的执行。
当函数的try块发生某个异常,但并没有相应的catch子句将它捕获,此函数便会被中断,由异常处理机制接管,沿着“函数调用链”一路回溯,搜寻符合条件的catch子句。
3、标准异常
如果new 表达式无法从程序的空闲空间分配到足够的内存,它会抛出bad_alloc异常对象,如下:
vector<string> *
init(ifstream &infile){
vector<string > * ptext=0;
try{
ptext = new vector<string>;
//打开file 和file vector
}
catch(bad_alloc){
cerr<<"ouch . head memory exhausted!\n";
//清理 并退出
}
return ptext;
}