异常【throw】【try】【catch】

异常

更新时间:
2020.12.25 :异常基本知识


异常就是程序运行时的反常行为,比如:意外输入、失去数据库连接等。

异常处理就是专门处理程序引发的异常。

异常处理一般包含三个部分:

  1. throw表达式:表示抛出异常
  2. try语句:可能包含异常的程序要放在try语句块中,抛出的异常通常被某个catch子句处理,catch语句又叫异常处理代码
  3. 异常类:在throw表达式和catch子句之间传递异常具体信息

1-throw表达式

使用throw表达式引发(抛出)一个异常,包含关键字throw与一个表达式,这个表达式的类型就是抛出的异常类型。throw表达式后面有分号,表示这是一个完整的语句。下面的代码中,runtime_error是标准库异常类型的一种。

throw的作用类似于return,当执行一个throw时,throw后面的语句将不再被执行,throw语句能够将控制权由try语句转移到catch子句中。

throw runtime_error("abc");

2-try语句块

try语句块通用形式如下:

try{
    //程序
}catch(异常声明){
    异常处理代码
}catch(异常声明){
    异常处理代码
}

catch是一个语句块,后面没有分号。

一个catch子句执行完毕,就会跳到最后一个catch子句之后的语句。try语句块内声明的变量在外部无法访问,在catch子句内也无法访问。

2-1 try语句嵌套

当多个try语句嵌套时,若抛出异常,首先搜索抛出异常的函数,如果没有对应的catch语句,就终止该层函数,往上一层寻找,沿着程序执行的路径(表->里)逐层回退(里->表),直到找到对应的catch子句。若最终没能找到对应的catch,则调用terminate函数,非正常退出函数。

这个不断向外层函数查找的过程,称为栈展开。栈展开过程中,当前要退出的程序块中的局部对象会被销毁。

2-2 异常发生在try语句外

如果异常的抛出地点没有try语句,也就没有catch子句来处理,那么会直接调用terminate函数终止当前函数。


3-异常类

3-1 异常头文件

< exception >:定义了最普通的异常类。只报告一场发生,没有额外信息。

< stdexcept >:定义几种常用的异常类,详细信息如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UcMD3vgo-1608897647543)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20201225164115794.png)]

< new >:定义了bad_alloc异常类型

< type_info >: 定义了bad_cast异常类型

除了< exception > < new > < type_info >头文件的的异常类型只能以默认方式初始化,并且不能赋初始值外,其他遗产各类型必须使用字符串来初始化异常对象,该初始值含有错误相关信息。

3-2 异常类型的成员函数

只有what()一个,并且该函数没有参数,返回值是一个字符串(const char*),提供关于异常的文本信息。


4-析构函数与异常

问题:

如果一个程序块分配了资源,并且在释放块资源的前面发生了异常,那么释放资源的代码将不会被执行。

解决方法:

类对象分配的资源由类的析构函数释放,如果使用类来控制资源的分配,就能确保无论函数正常结束还是释放资源前遇到了异常,资源都能正确释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值