15.3.3 异常机制(2)
其中被引发的异常是字符串"bad hmean( )arguments: a = -b not allowed"。异常类型可以是字符串(就像这个例子中那样)或其他C++(www.cppentry.com)类型;通常为类类型,本章后面的示例将说明这一点。
执行throw语句类似于执行返回语句,因为它也将终止函数的执行;但throw不是将控制权返回给调用程序,而是导致程序沿函数调用序列后退,直到找到包含try块的函数。在程序清单15.9中,该函数是调用函数。稍后将有一个沿函数调用序列后退多步的例子。另外,在这个例子中,throw将程序控制权返回给main( )。程序将在main( )中寻找与引发的异常类型匹配的异常处理程序(位于try块的后面)。
处理程序(或catch块)与下面类似:
catch块点类似于函数定义,但并不是函数定义。关键字catch表明这是一个处理程序,而char*s则表明该处理程序与字符串异常匹配。s与函数参数定义极其类似,因为匹配的引发将被赋给s。另外,当异常与该处理程序匹配时,程序将执行括号中的代码。
执行完try块中的语句后,如果没有引发任何异常,则程序跳过try块后面的catch块,直接执行处理程序后面的第一条语句。因此处理值3和6时,程序清单15.9中程序执行报告结果的输出语句。
接下来看将10和 10传递给hmean( )函数后发生的情况。If语句导致hmean( )引发异常。这将终止hmean( )的执行。程序向后搜索时发现,hmean( )函数是从main( )中的try块中调用的,因此程序查找与异常类型匹配的catch块。程序中唯一的一个catch块的参数为char*,因此它与引发异常匹配。程序将字符串"bad hmean( )arguments: a = -b not allowed"赋给变量s,然后执行处理程序中的代码。处理程序首先打印s-捕获的异常,然后打印要求用户输入新数据的指示,最后执行continue语句,命令程序跳过while循环的剩余部分,跳到起始位置。continue使程序跳到循环的起始处,这表明处理程序语句是循环的一部分,而catch行是指引程序流程的标签(参见图15.2)。
|
| (点击查看大图)图15.2 出现异常时的程序流程 |
您可能会问,如果函数引发了异常,而没有try块或没有匹配的处理程序时,将会发生什么情况。在默认情况下下,程序最终将调用abort( )函数,但可以修改这种行为。稍后将讨论这个问题。