C++中异常处理

传统的错误处理方法

1.终止程序(例如segment  error)

2.返回错误码

3.返回一个合法值,让程序处于非法的状态

4.调用一个预先设置的出现错误时掉的函数-------回调函数

异常处理

异常,当一个函数发现自己无法处理的错误时,抛出异常,让函数的调用者直接或者间接的处理这个问题

异常的抛出和捕获

1.异常是通过抛出对象引发的,该对象的类型决定了应该激活哪个处理代码

2.异常被捕获是被离的最近最匹配的处理代码所捕获。

3.抛出异常后会释放局部存储对象,所以被抛出的对象也就还给操作系统了,throw表达式会初始化一个抛出的特殊的异常对象的副本,异常对象在传给对应的catch处理之后销毁

异常捕获的匹配规则

1.允许从非const对象到const对象的转换

2.允许从派生类类型到基类类型的转换(天然的切片)

3.将数组转为指向数组类型的指针,将函数转换成函数类型的指针(就和C语言函数传参相似)

异常重新抛出

1.用了第三方异常,你抛出的异常和我的不匹配(例如:new 失败 bad alloc)应当重新抛出自己识别的异常

2.异常安全问题导致的异常的重新抛出(例如new 和delete之间,如果抛异常,资源没释放内存泄漏死锁等问题,这时就应当捕获,释放空间,然后重新抛出异常,不要生吞异常)

c++中捕获异常原理

C++中异常的异常类:exception

有时我们抛了异常没捕捉,导致程序终止出错,exception类是异常类的基类,通过继承exception类定义合适的异常类,使构成多态,捕获只要捕获父类。(也就是exception)就可以捕获所有种类异常。(构成多态,指向那个子类对象,调哪个)

异常的优缺点

优点:比传统返回错误码的方式更清晰表示程序的错误(不仅把错误给你,还让你知道哪儿错了)

           有的第三方库使用异常,你使用异常能更好使用这些库

           不用层层检查,交付错误码,信息等。直接抛出去。

           引入异常能更好的测试代码,因为测试框架使用异常

缺点:执行流乱跳,不方便调试(打个断点都不进去)

             异常安全问题(new delete之间,如果抛异常,资源没释放,导致内存泄漏死锁等问题)

             导致性能下降(抛异常,异常对象很大,而错误码就4字节)

为什么不在本类中捕获异常?

没有意义,你捕获异常,就是想让外面知道哪错了,你到好,生吞异常,一字不提

异常的捕获是在编译期还是运行时?

答案:编译时,编译时的异常必须捕获,运行时异常可以不捕获。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值