C++异常处理基本介绍

C++异常处理

以下选自《C++语言程序设计》(第四版)

为了保持程序的健壮性,我们需要自行对程序加入异常处理。比如编写一个函数给其他人调用,需要考虑合法输入和非法输入,并进行相应的处理,保证出现死机和更为严重的后果。

异常处理的基本思想

程序运行的过程,可能产生的一些错误,大都是可以预见的,比如非法输入、逻辑错误(除0等)、硬件相关(内存不足、打印机等不可用之类)。

而发现错误的底层函数,我们不要求它一定具备处理错误的能力,但是我们要求它一定要拥有向上报错的能力。即它的调用者可以处理这个错误,如果调用者也无法处理,则层层上报。直到被问题被处理或者系统终止程序运行。

C++的异常处理手段

throw

	throw 表达式

try和catch

	try
	{
		throw 表达式;	
	}
	catch (异常声明)
	{
	}
	catch (异常声明)
	{
	}

程序编写的过程中,对于本函数无法处理,或者不归自己处理的异常,可以通过throw语句抛出。throw的操作数表示异常类型语法上与return语句的操作数相同。如果程序需要抛出多种异常,应用不同的操作数类型来相互区别。

而try后面的代码段放入认为可能会出现异常的代码段,并用throw抛出相应异常。

catch后面的异常声明,是指明要处理的异常类型和参数名称,捕获由throw表达式抛出的异常。这个异常声明和函数的形参类似,可以是某类型的值,也可以是引用。
多个catch语句依次检查,若异常声明类型与抛出的异常类型一致,则在此段处理,后面的则忽视。若异常声明为(···)则表示为可处理任意类型的异常,应当放在最后。

这个一致性匹配,主要包括三个方面
1.声明的异常类型就是抛出的异常类型或其引用。
2.声明的异常类型是抛出的异常类型的公共基类或其引用。
3.声明的异常类型与抛出的异常类型皆为指针,且后者到前者可隐式转换。

异常接口声明

为了加强可读性,使得用户可以方便知道所使用的的函数会抛出哪些异常,可以在函数的声明中列出这个函数可能会抛出的所有异常类型。
例如:

void fun() throw(int, bool, double,MyClass);

这表明fun()函数能且只能抛出int,bool,double,MyClass及其子类型的异常。
若没有包含异常接口声明throw(),则表明此函数可以抛出任意类型的异常。
若throw()括号内没有任何内容,则表明此函数不抛出任何异常。

注意: 若一个函数抛出了其异常接口声明所不允许的异常,unexpected函数会被调用,默认调用terminate函数中止程序。用户可自定义unexpected函数。

异常处理中的构造与析构

在被catch捕获后,若catch的异常声明是一个值参数,则其初始化方式为复制抛出的异常对象。若是引用,则其初始化方式为使用该引用指向异常对象。
在被try中的代码段抛出异常后,在throw前构造的所有对象都会被自动析构,顺序与构造的顺序相反。这一过程又叫栈的解旋

以上是C++异常处理的一些基本概念。下一次总结标准程序库异常处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值