C++深入理解(12)------异常详解(读书笔记)

        很早就知道异常机制了,通过try、catch块可以截获到常常造成系统崩溃等的异常。这样就可以防止服务器崩溃等问题。但是我们平常也只是简单的使用,并未了解其内部的原理。恰好看到这里,将心得记录下来。

      最简单的用法就是:

try
{

}
catch(...)
{
}

        catch(...)表示可以截获任何异常,只要try中有奔溃的错误等,如数组越界就会直接被catch块截获,然后可以打印一些错误信息等等。catch当然也可以截获具体的消息,必须与throw相对应。比如throw “hello”,catch(const char *s),那么就相当于const char*就是catch中的一个参数。当然这个参数也可以接收类,如类A,throw a---catch(const A&a)。

        C++98定义了异常的几种规范,但是C++11却取消了相关规范,认为规范是不好的,虽然不用,但是这里依然列出,方便看到老代码的时候知道其意义。

void func() throw();                 不抛出任何异常
void func() throw(bad thing);        可能抛出异常
void func() noexcept;                不抛出任何异常  

        关于栈解退,在调用函数的时候,通常会将调用之前的地址传入新的堆栈中,以便执行完函数之后,根据这个地址找到原来的位置,而新的函数也是一个新的栈,这个栈保存传入的参数,以及自己创建的自动变量的参数,然后在执行完后会进行推栈操作,将临时的参数销毁。当引发异常时,就会从异常处推栈,将此函数创建的局部变量或者对象销毁,执行对象等的析构函数,保证了内存不会泄露。然后向后退到try块中,并查找有没有接收异常的catch块,如果有进入这个块内,没有的话就要退出整个程序。

       还有一个知识点需要说明,throw 对象a;实际上throw a的副本,因为在throw之后,整正的a就被销毁了,系统临时创建一个副本,以方便catch接受,在cahch语块结束后,该临时变量也会被销毁。那既然是临时变量为什么在catch时用引用,是因为引用可以访问其派生类。

       C++为我们提供了一个exception的基类(在头文件exception中),我们在自己写类的时候,可以继承这个类,就拥有了catch(exception&)的能力,具体怎么使用可以查相关资料,这里不做详细介绍。同时,在发生未捕获异常的时候,可以修改系统的反应,调用set_teminate()。因为发现未捕获异常的时候先调用teminate()函数,然后此函数调用abort(),导致程序终止。

      

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值