1.异常处理简介
有的程序虽然能通过编译,也能投入运行。但是在运行过程中会出现异常,得不到正确的运行结果,甚至导致程序不正常终止,或出现死机现象。
例如: .在一系列计算过程中,出现除数为0的情况。
.内存空间不够,无法实现指定的操作。
.无法打开输入文件,因而无法读取数据。
.输入数据时数据类型有错。
由于程序中没有对此的防范措施,因此系统只好终止程序的运行。这类错误比较隐蔽,易被发现,往往耗费许多时间和精力,这成为程序调试中的一个难点。
在设计程序时,应当事先分析程序运行时可能出现的各种意外的情况,并且分别制订出相应的处理方法,这就是程序的异常处理的任务。
2.C++异常处理基础 try、throw、catch
C++处理异常的机制是由3个部分组成的,即检查(try)、抛出(throw)和捕捉(catch)。把需要检查的语句放在try块中,throw用来当出现异常时发出(形象地称为抛出,throw的意思是抛出)一个异常信息,而catch则用来捕捉异常信息,如果捕捉到异常信息,就处理它。
异常处理的语法:
throw语句一般是由throw运算符和一个数据组成的,其形式为:
throw 表达式;
try-catch的结构为:
try
{
被检查的语句
if(...)
throw ...;
}
catch(异常信息类型[变量名])
{ 进行异常处理的语句}
·catch中的变量名可加可不加,如果是命名参数,则可以在catch中引用这个参数
·每一个catch对应一个异常处理器
3.异常处理实例
c++中列举的异常
namespace std {
class bad_cast;
class bad_alloc;
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;
}
实例
#include <iostream>
#include <stdexcept>
// Integer division, catching divide by zero.
inline int intDivEx (int numerator, int denominator) {
if (denominator == 0)
throw std::overflow_error("Divide by zero exception");
return numerator / denominator;
}
int main (void) {
int i = 42;
try {
i = intDivEx (10, 2);
} catch (std::overflow_error e) {
std::cout << e.what() << " -> ";
}
std::cout << i << std::endl;
try {
i = intDivEx (10, 0);
} catch (std::overflow_error e) {
std::cout << e.what() << " -> ";
}
std::cout << i << std::endl;
return 0;
}
//以上代码输出:
//5
//Divide by zero exception -> 5
以上是一个处理除数为零的异常的例子,函数intDivEx 内部检测第二个参数是否为0,为0则抛出异常,在外部catch (std::overflow_error e) 接收并且处理这个异常。
·使用catch(…){}可以处理所有的异常
catch(...)
{
进行异常处理的语句
}
4.在函数声明中进行异常情况指定
为了便于阅渎程序,使用户在看程序时能够知道所用的函数是否会抛出异常信息以及异常信息可能的类型,C++允许在声明函数时列出可能抛出的异常类型,如可以将例中的函数声明为:
inline int intDivEx (int numerator, int denominator); throw(std::overflow_error)