目录
一、异常的定义
二、异常的抛出和捕获
1.throw
2.try...catch
3.异常安全
4.异常规范
三、系统预定义异常
四、用户自定义异常
异常在C++用于错误处理,C语言中一般使用返回值表示错误,C++对错误处理进行了扩展,统一使用异常机制来处理程序中发生的错误。
C语言异常处理机制
①终止程序。缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。
②返回错误码。缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。
③C标准库中setjmp和longjmp组合
C++的异常处理包括两个部分:抛出异常和捕获异常,如果抛出的异常被捕获,处理完之后程序会继续运行,如果抛出的异常未被捕获,将导致程序终止。
二、异常的抛出和捕获异常是面向对象语言常用的一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数直接或间接的调用者处理这个错误。
- throw:当程序出现问题时,可以通过throw关键字抛出一个异常。
- try:try块中放置的是可能抛出异常的代码,该代码块在执行时将进行异常错误检测,try块后面通常跟着一个或多个catch块。
- catch:如果try块中发生错误,则可以在catch块中定义对应要执行的代码块。
throw是用于抛出异常的关键字,用法如下:
throw 异常(对象);
在函数声明中应该指定可能抛出的异常,应该在函数声明指定。
void show(); //该函数可能抛出任何异常
void show()throw(); //该函数不抛出任何异常
void show()throw(char,int); //该函数可能抛出char和int型异常
2.try...catch捕获异常使用try...catch关键字,用法如下:
try{
//可能抛出异常的代码
}catch(异常类型1 变量){//根据类型捕获异常
//处理异常类型1的代码
}catch(异常类型2 变量){//根据类型捕获异常
//处理异常类型2的代码
//throw 变量 ----- 继续向上一层抛出
}.....
异常被捕获后,执行对应的异常处理代码,然后继续执行try...catch之后的代码。若异常未被捕获,仍然导致程序终止。捕获异常后,如果当前无法处理,可以继续抛出。
异常的抛出和捕获的匹配原则:
①异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个catch的处理代码,如果抛出的异常对象没有捕获,或是没有匹配类型的捕获,那么程序会终止报错。
②被选中的处理代码(catch块)是调用链中与该对象类型匹配且离抛出异常位置最近的那一个
③抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch以后销毁
④catch(...)可以捕获任意类型的异常,但捕获后无法知道异常错误是什么。
⑤实际异常的抛出和捕获的匹配原则有个例外,捕获和抛出的异常类型并不一定要完全匹配,可以抛出派生类对象,使用基类进行捕获,这个在实际中非常有用
在函数调用链中异常栈展开的匹配原则:
①当异常被抛出后,首先检查throw本身是否在try块内部,如果在则查找匹配的catch语句,如果有匹配的,则跳到catch的地方进行处理。
②如果当前函数栈没有匹配的catch则退出当前函数栈,继续在上一个调用函数栈中进行查找匹配的catch。找到匹配的catch子句并处理以后,会沿着catch子句后面继续执行,而不会跳回到原来抛异常的地方。
③如果到达main函数的栈,依旧没有找到匹配的catch,则终止程序。
void func1()
{
throw string("这是一个异常");
}
void func2()
{
func1();
}
void func3()
{
func2();
}
int main()
{
try
{
func3();
}
catch (const string& s)
{
cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?