异常处理
C++异常处理机制是一个用来有效地处理运行错误的非常强大且灵活的工具,它提供了更多的弹性、安全性和稳固性,克服了传统方法所带来的问题.
异常的抛出和处理主要使用了以下三个关键字: try、 throw 、 catch 。
try语句
try代码块由关键字try以及后面的一对大括号组成,大括号中定义的代码块,就是可能出现异常的代码。try代码块中包含了可能引起异常的语句以及发生异常时应该跳过的语句。(也就是可能引起异常的函数以及没有异常发生时应该执行的语句)。异常可能是由try代码块中的代码直接导致的,也可能是由于调用其它函数导致的,还有可能是由于try代码块中的代码所发起的深层嵌套函数调用所导致的。
catch语句
异常是由catch处理器处理的,他会捕获并处理异常。在每个try代码块之后,必须至少紧挨着一个catch处理器。每个catch处理器都以关键字catch开始,并在一对圆括号中指定一个异常参数(exception parameter),表示它能够处理的异常的类型(DivideByZeroException)。当try代码块发生异常时,就会执行异常参数的类型与这个异常匹配的那个catch处理器(即catch代码块的类型与被抛出的异常类型准确对应,或者是他的基类)。如果异常参数包含可选的参数名,则catch处理器可以使用这个参数名与catch处理器代码体重被捕获的异常交互。
throw语句
throw语句用来主动抛出异常。如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛出了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。由于C++使用数据类型来区分不同的异常,因此在判断异常时,throw语句中的表达式的值就没有实际意义,而表达式的类型就特别重要。
异常处理的一般格式为:
try
{
//被检查语句
throw 异常;
}
catch(异常类型1)
{
//进行异常处理的语句1
}
catch(异常类型2)
{
//进行异常处理的语句2
}
catch(...)//捕获所有的异常
{
}
在异常匹配的时候,只对类型进行匹配,不关心抛出的异常对象的值。
异常的类型
(1)可以抛出基本数据类型异常,如int和char等;
(2)可以抛出复杂数据类型异常,如结构体(在C++中结构体也是类)和类;
(3)C++的异常处理必须由调用者主动检查。一旦抛出异常,而程序不捕获的话就会导致程序异常终止。
注意事项
(1)try和catch块中必须要用花括号括起来,即使花括号内只有一个语句也不能省略花括号;
(2)try和catch必须成对出现,一个try_catch结果中只能有一个try块,但可以有多个catch块,以便与不同的异常信息匹配;
(3)如果在catch块中没有指定异常信息的类型,而用删节号"...",则表示它可以捕获任何类型的异常信息
(4)C++中一旦抛出一个异常,如果程序没有任何的捕获,那么系统将会自动调用一个系统函数terminate,由它调用abort终止程序
(5)构造函数内可以抛出异常,析构函数内不要抛出异常。
标准异常对象的类型
在C++标准库中,有些函数抛出特定的异常,而另外一些根本不抛任何异常。
因为C++标准中没有明确规定,所以C++的库函数可以抛出任何对象或不抛。
但C++标准推荐运行库的实现通过抛出定义在<stdexecpt>中的异常类型或其派生类型来报告错误:
class logic_error;
class domain_error;
class invalid_argument;
class length_error;
class out_of_range;
class runtime_error;
class range_error;
class overflow_error;
class underflow_error;