C++中的异常处理

来源:互联网 发布:des算法代码 编辑:程序博客网 时间:2024/06/04 21:59

C++中的异常处理机制通常的异常抛出和处理主要使用下面这三个关键字:try,throw,catch
throw:异常检查部分使用throw表达式来表示它遇到了无法处理的问题,即throw引发了异常。
catch:捕获异常,处理异常。
try:异常处理部分使用try语句块处理异常,try语句块中代码抛出的异常通常会被某个catch子句处理。
注意:1、一个异常如果没有被捕获,则它将终止当前的程序。
2、catch子句包括了三部分:关键字catch,异常声明,一个块。
catch(…):捕获所有异常。
3、异常处理仅仅通过类型而不是通过值来匹配的,所以catch块的参数可以没有参数名称,只需要参数类型。

异常处理形式如下

try{    //可能出现异常的代码块}catch(类型名 形参名) //捕获特定异常{    //特定异常处理}catch(...) //捕获所有的异常处理方法{    //所有异常处理}

栈展开:
当程序抛出一个异常后,程序会暂停后面代码的运行,寻找与异常相匹配的catch子句,当throw出现在一个try中时,就会在该语句块中查找与他相匹配的catch,如找到,则使用该catch处理异常,否则,如该try语句嵌套在别的try中,就在外层的try中查找与之匹配的catch,若仍然未找到与之匹配的catch,则退出当前的这个函数,继续在调⽤函数的栈中查找,不断重复上述过程。若到达main函数的栈,依旧没有匹配的, 则终⽌程序。
异常捕获的匹配规则 :异常对象的类型与catch说明符的类型必须完全匹配。
注意: 1. 允许从⾮const对象到const的转换。
2. 允许从派⽣类型到基类类型的转换。
3. 将数组转换为指向数组类型的指针,将函数转换为指向函数类型的指针。
异常与返回错误码相比的优缺点:
1,许多C++第三方库使用异常,关闭异常则导致难以结合。
2,异常能清楚的表达错误原因,错误码只能是整型,不能描述错误原因
3,异常打乱执行流,影响我们调试分析代码。
4,异常有异常安全的问题,需要尽量使用PAII配合
5,很多测试框架使用异常gtest/gmock_ut.

0 0