在C++中程序采用异常处理机制对异常进行检查和控制,即采用try-throw-catch语句对异常进行检测、捕获和处理,那么对于例9.1中的除数为0,这样的异常该如何检查和控制呢?
C++中异常处理机制是首先对可能出现异常的程序段进行检测,当运行出现异常时,抛出异常,通知系统异常发生,然后系统捕获异常,最后在异常处理段对异常进行处理。这种异常处理机制可以用异常处理语句实现,异常处理的语法如下。
try程序块是对可能出现异常的程序段进行检测,如果检测到异常,就抛出(throw)异常,不再执行“其他语句”,跳到捕获异常catch程序块去执行。被抛出的异常可以用数值、字符串,甚至是对象等表示。如果没有检测到异常,则执行语句块中的“其他语句”,然后跳过catch语句块执行其后的语句。try块内可以检查多种异常,会抛出多种类型的异常。catch语句块作用是捕获异常和对异常进行处理,catch后的异常形参类型要和throw 抛出的异常类型一致,所以可以有多个catch语句,仅捕获与异常参数类型匹配的异常。
try块对异常进行检测,检测到后就会throw 异常,catch语句捕获异常,在catch块内处理异常。
【例9.2】进行除法运算,输入被除数和除数,若除数为0捕获异常并处理,要求程序重新输入被除数和除数,直到除数不为0,输出结果,结束程序。
程序的运行效果如下:
输入被除数和除数:5 0
出现除数为0的异常!
请重新输入!
输入被除数和除数:3 0
出现除数为0的异常!
请重新输入!
输入被除数和除数:5 8
result=0.625
程序运行结束!(www.daowen.com)
程序运行中,前两次输入都是除数为0,都被检测到异常,抛出异常,被catch语句捕获,输出错误的信息“出现除数为0的异常!”,然后执行“goto abc;”语句跳转到标签abc处重新输入,第三次输入除数非0,执行throw 语句后的语句,输出结果后,跳转到catch语句块后,输出“程序运行结束!”。
C++的异常处理中,若函数内可能产生异常,可以不在函数内处理,抛出异常,而在调用函数处检查并捕获异常,对异常进行处理。
【例9.3】设计除法函数,在除数为0时,抛出整型数异常。在main函数中调用除法函数,并对异常进行检测和捕获处理。
程序的运行结果如下:
输入被除数和除数:3 9
result=0.333333
输入被除数和除数:3 0
i=1除数为0的异常!
程序运行结束!
当输入的除数不是0时,程序正常运行,输出计算结果;当输如的除数为0时,在div()函数中抛出异常,在调用函数main函数中检测异常并捕获异常,并在catch 块中处理了异常。
C++中异常处理过程一般如下:当函数内产生异常时,抛出异常,异常的传递是自下而上的,即如果本函数内有捕获异常匹配就处理,如果没有就传递到它的上层(调用函数)处,如果还没有就继续往上抛,直到找出匹配的处理异常的catch语句为止。如果到最外层的catch语句也没有匹配的异常处理块,则系统将自动调用库函数abort()函数,终止程序的运行。
重点提示
抛出的异类型必须与捕的形式参数类完全匹配,才处理异常,不许类型兼容或换,若没有确的匹配类型,统会用abort(函数终止程序运行。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。