您当前的位置: 首页 >  c++

风间琉璃•

暂无认证

  • 6浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++ 异常处理

风间琉璃• 发布时间:2022-10-10 15:04:21 ,浏览量:6

目录

 一、异常的定义

二、异常的抛出和捕获

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块中定义对应要执行的代码块。
1.throw

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             
关注
打赏
1665385461
查看更多评论
0.0698s