异常处理机制
C++异常处理机制是一种用来有效地处理运行错误的非常强大且灵活的手段,它允许开发者识别、查找、获取、纠正错误,C++中的异常处理机制克服了传统方法所带来的问题,使得程序中独立开发的各部分能够在程序执行期间对出现的问题相互通信并完成处理。
可以先回顾一下C语言中异常处理的方式。在C中没有专门的异常处理机制,对错误的处理借助于两种方法,第一种是通过函数返回值描述函数运行状态,第二种是使用errno宏记录错误值,再通过perror()或strerror()函数给出错误提示。这两种方法简单直观,但最大的缺陷就是会出现不一致问题。例如有些函数返回1表示成功,返回0表示出错,而有些函数则恰恰相反。另外,由于函数的返回值只有一个,若通过函数的返回值表示错误代码,函数就不能返回其他值。
相比C语言简单的异常处理方式,C++异常处理机制由以下几部分构成:
1、 抛出异常:若在某一个模块中检测出发生异常,但是在当前模块中无法处理该异常,异常处理机制将通过抛出异常的方式将包含有异常信息的对象发送到模块外部。
2、 捕捉异常:对于一个异常,若某个模块能够处理该异常,则该模块将获得程序控制权来处理该异常。
3、 处理异常:捕捉到异常后,按照一定策略对异常进行处理。
4、 标准库中的异常类:标准库中提供了一组异常类在抛出异常和处理异常间传递信息。
C++中引入try、catch、throw关键字用于实现异常处理。通常将一组可能产生异常的代码放在try包含的块内,若发生异常,则在块内通过throw抛出异常,紧随try之后的某个catch结构用来接收并处理该异常。
C++提供的异常处理机制具有以下优点:
1、 函数的返回值可以忽略,但异常不会被忽略。C语言中可以不处理函数的返回值,但如果C++程序中出现异常却没被捕获,程序就会终止,这会促使程序员开发出更健壮的程序。
2、 整型返回值没有任何语义信息,异常却可以包含语义信息,尤其定义异常类时,通过类名就可看出异常的基本信息。
3、 整型返回值缺乏相关的上下文信息,但通过异常处理机制,可以实现抛出异常模块和捕获异常模块之间的通信。若通过类抛出异常,类的成员可以传递足够的信息。
4、 异常处理可以在函数间传递。假设在多层函数调用的最内层出现错误,使用返回值需要在各层函数中都进行处理,使用异常处理机制,只需在调用结构的某一层进行处理就可以了。