首页 理论教育C++异常处理语法-C++程序设计基础教程

C++异常处理语法-C++程序设计基础教程

【摘要】:throw、try和catch语句的一般语法如下:throw表达式;异常处理的执行过程如下:程序通过正常的顺序执行到达try语句块,然后执行try块内受保护的语句。对于fun语句,其捕获异常的过程是相似的。只要找到一个匹配的异常类型,后面的异常处理都将被忽略。

在C++程序中,任何需要检测异常的语句(包括函数调用)都必须在try语句块中执行,异常必须由紧跟着try语句后面的catch语句来捕获并处理。因而,try与catch总是结合使用。throw、try和catch语句的一般语法如下:

throw表达式;

异常处理的执行过程如下:

(1)程序通过正常的顺序执行到达try语句块,然后执行try块内受保护的语句。

(2)如果受保护语句块执行期间没有引起异常,那么跟在try块后的所有catch子句就不执行,直接执行最后一个catch子句后面的语句。

(3)如果在受保护语句块执行期间有异常被抛出,则创建一个异常对象,将该异常对象与try块后的catch子句中的异常类型依次匹配。

(4)如果没找到匹配的catch子句,则运行函数terminate将被自动调用,而函数terminate的默认功能是调用abort终止程序。

(5)如果找到了一个匹配的catch子句,则catch子句后的复合语句会被执行。至此,当前的try块执行完毕。

例如,有以下程序:

程序中throw表达式抛出一个字符串类型的异常,它由具有char*类型参数的catch子句捕获。在存储器分配失败时,程序输出为:

异常引发:内存分配错误!

【例9.1】分析以下程序的执行结果。

解:上述程序中,调用factorial(n)求n!时,若n≤0则抛出一个异常。也就是说,当执行下列语句时,在函数factorial()中抛出异常:

cout<<"-5!="<<f(-5)<<endl;

异常被抛出后,在main()函数中被捕获,异常处理程序输出有关信息后,程序流程跳转到主函数的最后一条语句,输出“程序执行结束.”。而主函数中的下列语句没有被执行:(www.chuimin.cn)

cout<<"5!="<<f(5)<<endl;

程序的执行结果如下:

5!=120

n=-5 不能计算n!.

程序执行结束.

从该程序中可以看出,throw语句可以不出现在try语句块中,而是包含在被调用的自定义函数或系统函数中。在函数体执行过程中若执行了throw语句,则其后的语句都将被跳过。函数抛出的异常可以不在本函数中处理,而是传给它的上级函数(即调用它的函数),若上级不能处理,则再次上传,如此层层上传,如果上传到main函数还无法处理,则只好终止程序的执行。

【例9.2】分析以下程序的执行结果。

解:本程序的执行结果如下:

捕获整数类型:0

捕获字符类型:y

捕获双精度类型:32.657

从程序执行结果可以看出,当执行fun(0)语句时,在函数fun()中抛出一个整数类型的异常,在后面的异常处理块中首先出现的是catch(intm),它可以捕获该异常。当执行fun(1)语句时,在函数fun()中抛出一个字符类型的异常,在后面的异常处理块中首先出现的是catch(intm),它不能捕获该异常,向下匹配到catch(char c),它可以捕获该异常。对于fun(2)语句,其捕获异常的过程是相似的。

注意:catch处理程序的出现次序很重要,因为在一个try块中,异常处理程序是按照它出现的次序依次匹配的。只要找到一个匹配的异常类型,后面的异常处理都将被忽略。