异常处理
一、抛出异常(Throwing an Exception)
所谓异常是某种对象。最简单的异常对象可以设计为整数或字符串:
- throw 42
- throw “panic:no buffer!”
大部分时候,被抛出的异常都属于特定的异常类(也许会形成一个继承体系)。
二、捕捉异常(Catching an Exception)
我们可以利用单一或连串的catch子句来捕捉(catch)被抛出的异常对象。catch子句由3部分组成:关键词catch、小括号内的一个型别或对象、大括号内的一组语句(用以处理异常)。 下面是一个例子:
extern void log_message(const char*);
extern string err_message[];
extern ostream log_file;
bool some_function()
{
bool status = true;
// …………经过一些程序到达此处!
catch(int errno){
log_message(err_messages[errno]);
status = false;
}
catch(const char *str){
log_messsage(str);
status = false;
}
//取某个异常类的对象
catch(iterator_overflow &iof){
log_message(iof.what_happend(log_file));//返回异常信息的类函数
status = false;
}
//最后
return status;
}
- 重抛:某些情况下可能无法完成异常的完整处理。在记录消息之外,重抛相同类别的异常。这时只需写下关键词throw即可。只能出现在catch子句中。
catch(iterator_overflow &iof)
{
log_message(iof.what_happened());
//重抛异常,令另一个catch子句接手处理
throw;
- 如果想要捕捉任何型别的异常,可以使用一网打尽(catch-all)的方式。只需在异常声明部分指定省略符号(……) 即可,像这样:
//捕捉任何型别的异常
catch(...)
{
log_message("exception of unknown type");
// clean up
}