C++处理异常的机制是由3个部分组成:检查(try),抛出(throw),捕捉(catch)。把需要检查的语句放在try块中,throw用来当出现异常时发出一个异常信息,而catch则用来捕捉异常信息,就处理它。
异常处理的语法如下:
(1)throw语句的形式为:
throw 表达式
(2)try-catch的结构为:
try
{被检查的语句}
catch ( 异常信息类型 [ 变量名 ] )
{进行异常处理的语句}
说明:
1,被检测的部分必须放在try块中,否则不起作用。
2,try 块和catch块必须作为一个整体出现,不能没有try块只有catch块,在二者之间也不能插入其它语句。但是在一个try-catch结构中,可以只有try块而没有catch块,把catch处理块放在其他函数中。
3,try和catch块中必须有用花括号包起来的复合语句,即时花括号中只有一个复合语句也不能省略花括号。
4,一个try-catch结构中只能有一个try块,但却可以有多个catch块,以便与不同的异常信息匹配。
5,catch后面的圆括号中,一般只写异常信息的类型名,如: catch(double),只要throw抛出的是一个double类型的变量,catch就能捕获这个异常。
6,catch还有另一种写法,即除了指定类型名外,还可以指定变量名:catch(double b ),此时如果throw抛出的时double类型的变量a ,则catch在捕获异常信 息a的同时,还使b获得a的值。比如当抛出的时类对象时,我们希望在catch块中显示该对象的某些信息。
7,如果在catch块中没有指定异常信息的类型,而用了删节号“...",则表示可以捕获任何类型时异常信息。如 catch(...){cout<<"error"<<endl;}
8,try-catch结构可以与throw出现在一个函数中,也可以不出现在一个函数中,当throw抛出异常信息后,首先在本函数中找寻与之匹配的catch,如果在本层无try- catch结构或找不到与之匹配的catch,就依次转到上一层处理。
9,如果throw抛出的异常信息找不到与之匹配的catch块,那么系统就会调用一个系统函数terminate,使程序终止运行。
C++允许在声明函数时列出可能抛出的异常类型。例如:double fun(int a,double b)throw (double,int);
表示fun函数只能抛出int,double类型的异常。注意异常声明在函数声明和函数定义时都需要写出。
C++的异常处理机制会在throw语句抛出异常信息被catch捕获时,对有关的局部对象进行析构,析构对象的顺序与构造的顺序相反。