C++是早就开始接触了,但是接触了这么些年了,才开始系统地学习异常处理机制,这有点搞..不管怎样,说明现在比较静心,踏踏实实地学Cpp了..下面言归正传...
Cpp异常处理基本模式
Cpp的异常处理机制,是通过try,throw,catch实现的.通俗地讲,就是把可能出错误的代码包含在try模块中,在try模块中,若判定发现有错误,则通过throw语句把异常抛出try模块之外,当然当然,外面还有一个或n个catch模块负责捕获抛出来的异常,进行处理.基本的异常代码模块如下所示:
异常处理之堆栈解退机制
当然当然,如果没有一个catch是能胜任处理这个异常的,那么程序会试图在更外层的try-catch代码块中设法捕获这个异常,如果一直像洋葱剥皮一样剥到了最后还是没法捕获,那么会启用terminate函数,终止程序.这一剥洋葱的过程,就是异常处理的堆栈解退机制.
下面是堆栈解退的代码示例:
运行结果如下图所示:
这里面的function们抛异常,都使用了一种异常规范写法,那就是:
在这个规范中,异常定义从关键字throw开始,后面立即跟着位于一对圆括号中的函数的参数表,表示someFunction函数能够抛出N种Exception类型的异常.没有提供异常规范的函数,可以抛出任何异常.在函数的参数表后放一个throw()--空的异常规范,表示它不抛出异常,于是就会调用unexpected函数.
处理意外的异常
unexpected函数会调用通过set_unexpected函数注册的函数.如果函数没有以这种方式注册,则默认情况下会调用terminate函数.对这个我不是很理解函数注册,希望在今后的学习中对这部分有实践的认识.
标准类库中的异常层次
如果catch捕获了基类异常对象的指针或引用,那么也能捕获从这个基类派生的全部公有类的异常对象的指针或引用.