1.概念:异常处理是一种允许两个独立开发的程序组件在程序执行时遇到不正常的情况相互通信的工具
2.异常检测和异常处理的方式
throw表达式:程序遇到了错误或者无法处理的问题,使用throw引发异常
try、catch语句块:以关键字tyr开始,并以一个或多个catch子句结束。它们也被称为异常处理代码
一、throw
1.概念:程序的异常检测部分使用throw表达式引发一个异常
2.格式:
throw 表达式;
表达式可以为:整型、浮点型、字符、字符串、类、函数......
3.注意事项
当执行throw时,跟在throw后面的语句将不再被执行。程序的执行权将转移到与之匹配的catch语句块中
如果一条throw表达式解引用一个基类指针,而这个指针指向于派生类对象,则抛出的对象被切掉的一部分是基类部分中的。会在下面详细讲解
二、try、catch语句块
1.格式
try{
...
}
catch(){
...
}
catch(){
...
}
2.注意事项
try和catch都不可以省去花括号,尽管后面只有一条语句也不能省去
在try和catch组合中,try最多只有一个,catch可以有多个
嵌套:try和catch语句块中都可以再嵌套try、catch语句块组合
try中使用throw抛出一个异常时,跳转到参数类型与throw后面表达式类型相对应的catch语句块中,throw后面的语句将不再执行
栈展开:下面介绍
三、catch的相关知识
catch的参数
①若catch的参数为类对象,则:
若参数为非引用类型,在catch语句块中实际上改变的是局部副本,不改变传入的异常对象本身。相反,如果参数为引用类型,则在语句块内改变参数,也就是改变对象本身
如果catch的参数为基类类型,则我们可以使用派生类类型的异常对象对其进行初始化。如果是非引用类型,则异常对象将被切掉一部分,若是引用类型,则以常规的方式绑定到异常对象上。如果传入的参数与某个继承有关,最好将参数定义为引用类型
重点:catch参数是基类类型,catch无法使用派生类特有的成员
catch的书写顺序
①若多个catch与句之间存在着继承关系,则:
继承链最低端的类放在前面,继承链最顶端的类放在后面
catch语句重新抛出
概念:有时,一条单独的catch语句不能完整地处理某个异常,会将传递的异常继续传递给外层try、catch组合或者上一层的函数处理
语法格式:throw; //只是一条throw,不包含任何表达式
throw;只能出现在catch语句或者由catch语句直接或间接调用的函数之内
如果catch参数是引用类型,在catch语句中改变参数值,下一条catch接受的是改变后的参数。代码如下
try
{
try{
}
catch(A &a){
a.data=100;
throw; //将异常抛出给外层处理,因为a为引用,因此抛出后a.data=100
}
}
catch(A a){
</