在C语言中,通常采用两种方法处理异常:①对每个函数调用错误测试;②调用setjmp()和std::longjmp()函数来截取错误条件。
第一种方法是用类似全局宏errno的变量、零或错误函数的返回值来报告错误种类。这种方法可靠但非常烦琐。程序员无法全部考虑各种错误的可能性。其中errno包含在头文件<cerrno>中,其声明形式为:
第二种方法是用setjmp()和std::longjmp()函数。这两个函数的使用更能接近于C++异常处理所能达到的效果,能够依次、自动地把堆栈还原至函数调用层次结构中较高层位置所记录的状态。setjmp()和std::longjmp()函数会截取和处理不需要瞬时终止程序的错误条件。程序使用setjmp()指定返回的位置,并使用std::longjmp()返回到该位置。
上述两种异常处理办法均不能完好地解决异常处理问题。
在C++中,通常使用try块和catch块进行异常的捕捉和处理。try块中可以执行一些C++函数,能检测出执行过程中的异常,并能在出错之后恢复。try块的声明形式如下:
在try块之外执行的代码不能检测出或处理异常情况,假如在某个try块外面的代码发生异常,程序一般会束手无策,无法正确处理。try块还可以嵌套其他try块,一旦发生意外,try块会调用其他能够检测和处理异常的函数。
catch块用于处理异常。理论上catch块出现在try块之后,并且catch块包含形参。catch块的声明形式如下:
catch块可以“捕捉”到的由try块中某个throw语句抛出的异常。try块之后可以列出多个具有不同形参列表的处理函数。(www.xing528.com)
例如,
不同的catch()块通过形参列表中的类型区分,因此不必给catch形参列表中的形参命名。如果形参被命名,即声明了具有名字的对象,异常检测代码会传递形参值;如果形参没有被命名,将丢弃异常检测代码中的throw语句的实参。
throw语句是用来抛出异常的。为了检测出异常并跳转到某个catch处理函数,C++函数发出throw语句,语句中包含的数据类型与适当的catch处理函数的形参列表相匹配。例如,
该throw语句跳转到具有char∗形参列表的catch异常处理函数。throw语句还会还原堆栈,通过调用对象的析构函数清除在try块内声明的所有对象。之后,throw会调用匹配的catch处理函数,传递形参对象。
提示
若catch()的形参为省略号(即catch(…)),则catch处理函数能捕捉到所有未曾被捕捉的异常。通常catch(…)块放在所有catch块的最后。
下面用一个示例讲述异常处理的问题。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。