【C++】C++异常处理

一、什么是异常?
异常就是程序在运行过程中,由于使用环境的变化及用户的错误操作而产生的错误。
二、传统错误处理办法:
1.终止程序(除数为0)
2.返回一个表示错误的值,附加错误码(GetLastError())
3.返回一个合法值,让程序处于某种非法的状态(坑爹的atoi())
4.调用一个预先准备好在出现”错误”的情况下用的函数(回调函数)。
5.暴力解决方式:abort()或者exit()
6.使用goto语句
三、异常处理语句块
1.try语句块
用来框定异常。在程序中,需要先框定可能产生异常的语句块。若不框定就等于没有发现异常的存在。

try
{
内嵌throw语句的语句;
}

try语句块一般包含一个以上的throw语句块,如果没有包含任何throw语句,程序会根据运行情况,抛出默认的错误。
try语句块后面必须包含最少一个catch语句块。如果try语句后面带有多个catch语句块,则需要和throw抛出的数据类型匹配,匹配成功后进行相应的catch语句块的异常处理语句。
2.throw语句块
(1)带表达式的形式

throw type exception;

type表示已经声明的数据类型,如float、long以及结构类型。exception表示变量名,可添加也可不添加。
(2)不带表达式的形式:

throw;

throw抛出的不仅是表达式,也可以是具体的值,其中类型最为重要。抛出的数据有catch语句接受,接受原则是先按照类型匹配,如果有多个catch语句类型都匹配,则按照就近原则接受。既有数值也有该数值对应的类型时,类型是第一重要的。其次才是数值。
3.catch语句块
用来处理try块中抛出的异常

catch(type[exception])//匹配throw抛出的exception语句块;
{
   //匹配成功后,处理异常语句放在这里
}
catch(...)//匹配throw抛出的任意类型语句块
{
   //语句
}

catch后面圆括号包含的参数只能有一个,参数入口的类型名称是不可缺少的,但是形参exception则是可有可无。

异常的流程是:
首先检测触发throw语句所在的函数,明确throw语句所属try块,如果这一检测成功,就按照throw语句抛出的数据类型,在try块管辖的catch块根据其先后出现的次序比较,如果查询到刚好捕获相应类型的catch块时,就运行相应catch块语句。

使用try-catch处理异常的格式为:

try
{
   Throw param1;
   Throw type2 [param2];
}
catch(type1 )
{
   语句1;
}
catch(type2 [param2])
{
   语句块n;
}
catch(...)  //匹配throw抛出的任意类型的语句块;
{
   ...
}

四、异常的抛出和捕获
1. 异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个处理代码。
2. 被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个。
3. 抛出异常后会释放局部存储对象,所以被抛出的对象也就还给系统了,throw表达式会初始化一个抛出特殊的异常对象副本(匿名对象),异常对象由编译管理,异常对象在传给对应的catch处理之后撤销。
五、栈展开
抛出异常的时候,将暂停当前函数的执行,开始查找对应的匹配catch子句。
首先检查throw本身是否在try块内部,如果是再查找匹配的catch语句。
如果有匹配的,则处理。没有则退出当前函数栈,继续在调用函数的栈中进行查找。
不断重复上述过程。若到达main函数的栈,依旧没有匹配的,则终止程序。
上述这个沿着调用链查找匹配的catch子句的过程称为栈展开。
找到匹配的catch子句并处理以后,会继续沿着catch子句后面继续执行。
六、异常捕获的匹配规则
异常对象的类型与catch说明符的类型必须完全匹配。只有以下几种情况例外
1. 允许从非const对象到const的转换。
2. 允许从派生类型到基类类型的转换。
3. 将数组转换为指向数组类型的指针,将函数转换为指向函数类型的指针。
七、异常的重新抛出
有可能单个的catch不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层的调用链函数来处理,catch则可以通过重新抛出将异常传递给更上层的函数进行处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值