16.2.3 自定义异常对象

    抛出类型可以是自定义的类对象,这样做的优点一方面在于可以使用不同的异常类型来区分不同函数在不同情况下引发的异常,另一方面,自定义的类对象可用来传递信息,如以下示例代码16.5所示。

    代码16.5 自定义异常对象DefineAnException


    <———————————文件名:example1605.cpp———————————————-> 01 #include<iostream> 02 using namespace std; 03 class Exception1 04 { 05 public: 06 void disp() 07 { 08 cout<<"Exception1异常被引发"<<endl; 09 } 10 }; 11 class Exception2 12 { 13 public: 14 Exception2(const Exception1&)//以Exception1来复制构造Exception2 15 { 16 } 17 void disp() 18 { 19 cout<<"Exception2异常被引发"<<endl; 20 } 21 }; 22 void fun() 23 { 24 throw Exception1();//抛出Exception1类型的异常(默认的构造函数) 25 } 26 int main() 27 { 28 try 29 { 30 fun(); 31 } 32 catch(Exception2&Ex)//引用传递而不是值传递 33 { 34 Ex. disp(); 35 } 36 catch(Exception1&Ex) 37 { 38 Ex. disp(); 39 } 40 return 0; 41 }

    输出结果如下所示。


    Exception1异常被引发

    【代码解析】代码中首先定义了两个类Exception1和Exception2,函数fun不进行任何的操作,仅仅是抛出了Exception1类的对象,在对象创建的时候,使用的是系统默认的无参构造函数,在main函数中有两个catch块来捕获异常,前一个用以匹配Exception2类型,后一个用以匹配Exception1类型,这里有个疑问是在代码第14行Exception2类中定义了一个复制构造函数,其参数是Exception1类对象,那异常处理机制是否会自动将fun函数中抛出的Exception对象转换成一个Except2对象,使得第一个catch块被匹配呢?答案是否定的,异常处理机制在处理异常的过程中不会做任何形式的转换,只寻找和参数最匹配的catch块进行处理,异常将被第二个catch语句捕获,当然有种特殊情况,那就是类继承。