异常处理程序
处理程序
异常处理程序(catch函数)必须紧跟在try块之后。当某个异常被抛出,异常处理机制会按照catch块的代码顺序依次寻找匹配的catch块。一旦找到一个相匹配的catch块,则系统认为该异常已得到处理。
异常处理程序的格式
C++使用一种专门的以保留字try开头的结构来定义。try结构包含一个称为try子句的复合语句和一系列异常处理程序。复合语句定义了后面异常处理程序的作用域。这一结构的一般形式是:
每一个catch函数就是一个异常处理程序。catch函数可以只有一个形式参数,与C++中函数定义中的形式参数相似,包括可以是一个省略号(…)。带有省略号形式参数的异常处理程序,是捕获所有异常的处理程序,对于任何异常f如果没有找到合适的异常处理程序就被使用。形式参数也可以是不加修饰的类型说明,例如float,就像在函数原型中一样。在这种情况下,形式参数的唯一用途是唯一标识该异常处理程序。当关于异常的信息被传递给异常处理程序时,形式参数包含了一个用于异常信息传递的变量名。由于参数的类可以是任意的用户自定义类,参数可以包含任意所需数目的数据成员。
在C++中,异常处理可以包含任意的C++代码。
异常与处理程序的绑定
C++的异常只能显式地由语句throw抛出,throw的一般形式用EBNF表示为:
throw[表达式];
方括号是元符号,用于表示表达式是可选的。没有操作数的throw只能出现在异常处理程序中,当它出现的时候再次抛出异常,使异常在别处被处理。这种作用与Ada是完全一样的。
throw表达式的类型选择了特定的异常处理程序,这个异常处理程序当然必须有“相匹配”类型的形式参数。在这里,“相匹配”的意义是:形式参数为类型T、const T、T&(对类型T的对象的引用)或const T&的异常处理程序,与类型为T的表达式的throw相匹配。当T是类时,参数为类型T或任何T的祖先的异常处理程序可以匹配。
在try结构中抛出的异常使try结构中代码的执行立即结束,从紧跟在try结构的异常处理程序开始,搜索相匹配的处理程序。搜索匹配的过程对多个异常处理程序依次进行,直到找到匹配,即如果在完全匹配的异常处理程序之前有任何其他匹配的,那么不会用完全匹配的异常处理程序。因此,用于特定异常的处理程序放在异常处理程序列表的最上面,后面跟更通用的异常处理程序。最后一个异常处理程序通常以省略号(…)为形式参数,它匹配任意的异常,这可保证所有异常都会被捕获。
如果在try子句中抛出异常,并且没有相匹配的异常处理程序与这个try子句相关联,异常就会传播。如果try子句内嵌在另一个try子句中,异常就会传播到与外层时子句相关联的异常处理程序。如果包围在外面的try子句都没有相匹配的异常处理程序,异常就传播到抛出异常的函数的调用者。如果对函数的调用不在一个try子句中,异常就传播到函数的调用者。如果在这个传播过程中没有在程序中找到相匹配的异常处理程序,就会调用默认的异常处理程序。
参考资料
最新修订时间:2022-08-25 13:06
目录
概述
异常处理程序的格式
参考资料