一 c++异常处理概述:
1.概念:
异常:程序运行时出现的不正常,例如耗尽了内存或遇到非法输入。异常存在于程序的正常功能之外,并要求程序立即处理。通过异常可以把问题的检测和问题的处理分开。
异常处理机制:提供程序中错误检测与错误处理部分之间的通信。
2.c++的异常处理包括:
*throw表达式(throw expression):错误检测部分使用这种表达式来说明遇到了不可处理的错误,即throw引发了异常条件。
*try块(try block):错误处理部分使用它来处理异常。try语句块以try关键字开始,并以一个或多个catch字句结束。在try块中执行的代码所抛出的异常,通常会被其中一个catch子句处理。
*标准库定义的一组异常类:用来在throw和catch之间传递有关的错误信息。
(1)throw表达式:
系统通过throw表达式抛出异常。throw表达式的类型决定了所抛出对象的类型。
如:throw runtime_error("this is a exception").
(2)try块:
try块的通用语法形式:
try{
program-statements
}catch(exception-specifier){
handler-statements
}
catch(exception-specifier){
handler-statements
}//...
try块以关键字try开始,后面是花括号括起来的语句序列块。try块引入局部作用于,在try块中声明的变量,包括catch子句中声明的变量,不能在try外面使用。
catch子句包括三个部分:关键字catch、圆括号内单个类型或者单个对象的声明-异常说明方法(exception-specifier)、用花括号括起来的语句块。一旦catch子句执行结束,程序流立即继续执行紧随着最后一个catch子句的语句。
寻找处理代码过程:抛出一个异常,首先要搜索的是抛出异常的函数,如果没有找到匹配的catch,则终止这个函数的执行,并在调用这个函数的函数中寻找匹配的catch,如果仍然没有找到相应的处理代码,该函数同样终止,搜索调用它的函数。如此类推,直到找到适当类型的catch为止。
如果不存在匹配的catch子句,程序的运行就要跳转到名为terminate的标准库函数,该函数在exception头文件中定义,terminate函数的行为依赖于系统,通常情况下将导致程序非正常退出。
(3)标准异常类:
标准异常类层次如下:
标准异常类定义在四个头文件中:
*exception头文件:定义了最常见的异常类,它的类名为exception,这个类只通知异常的产生,但不会提供更多信息。
*stdexcept头文件:定义了几种常见的异常类。如:runtime_error类(继承runtime_error的range_error、overflow_error和underflow_error)、logic_error类(继承logic_error的domain_error、invalid_argument、length_error和out_of_range)
*new头文件:定义了bad_alloc异常类型,提供由于无法分配内存而由new抛出的异常。
*typeinfo头文件:定义了bad_cast异常类型。
标准异常类只提供很少的操作,包括创建、复制异常类型对象以及异常类型对象的赋值。
*exception、bad_alloc和bad_cast只定义了默认构造函数,无法在创建对象时提供处置。
*其他异常类型对象只定义了一个使用string初始化式的构造函数。当需要定义这些类型的对象时,必须提供一个string参数。string初始化式用于为所发生的错误提供更多的信息。
*异常类型只定义了一个what操作。这个函数不需要任何参数,并且返回const char *类型的值(即C风格字符数组)。这个数组的内容依赖于异常对象的类型:对于接受string初始化式的异常类型,what返回该string作为C风格字符数组;对于其他异常类型,返回的值则根据编译器的变化而不同。