2.8 例外处理(1)
例外是由运行期错误导致的异常情况。例如,索引越界或new分配请求失败。在C++(www.cppentry.com)中,一个函数(如f)能够识别例外并通告例外的发生。这种通告机制称为抛出例外(throw an exception,throw是一个关键字)。例外抛出后,可以由函数f的调用者捕捉并进行处理,例外的捕捉借助catch(catch是一个关键字)程序块调用的函数f。catch程序块位于try程序块(try也是关键字)之后,是一个例外捕捉器。try程序块用来指示希望捕捉什么例外。如下的函数g包含了例外处理逻辑:
|
不同catch程序块可以按任何顺序排列,不过catch程序块必须定义在try程序块之后,因为例外是在try程序块中抛出的。例外和不同捕捉器之间的匹配是通过类型判定来进行的。如果f抛出一个int型的例外,它将被int catch程序块捕捉;如果f抛出一个char例外,它将被char catch程序块捕捉。如果f没有抛出任何例外,程序将跳过catch程序块继续执行。catch程序块可以包含一个参数(如上例所示),或因为抛出了特定类型的例外而直接输入catch程序块(如下例所示)。
例2-65
函数erase用于string类型(见2.5节),如果传递给erase的第一个参数(指出在string中的起始位置)越界,则抛出一个out_of_range例外(out_of_range是一个系统定义类型)。使用erase的程序可以采用如下方式检测是否越界:
|
开始执行,如果给出的index的数值在允许范围内,程序将继续执行其后的break语句,这样,循环将终止。如果index越界,erase将抛出一个out_of_range例外,该例外将被catch程序块捕捉。这样程序将执行catch程序块中的continue语句,从而使得循环再次执行,将提示用户输入一个合法的索引值。在这个简单的例子中,catch程序块没有参数,进入这个catch程序块的前提条件就是out_of_range例外的抛出。
string类型的函数insert、replace、substr同erase一样,如果第一个参数越界,也将抛出一个out_of_range例外。


