同样为了对付潜在的编程错误(尤其是运行时的错误),捕获异常是一种完全不同的办法。
简单地说,异常(exception)就是与预期不相符合的反常现象。
注意:使用异常处理将带来更多的系统开销,因此慎用异常。
assert 函数
头文件:#include <cassert>
assert函数要有一个参数,它将测试这个输入参数的真or假的状态。
真:Do nothind! 程序直接执行下一步;
假:Do something! 程序中断,并报错,从而避免发生更严重的问题。
基本使用思路:
1. 安排一些C++代码(try语句)去尝试某件事 —— 尤其是那些可能会失败的事(比如打开一个文件或申请一些内存)
2. 如果发生问题,就抛出一个异常(throm语句)
3. 再安排一些代码(catch语句)去捕获这个异常并进行相应的处理。
C++异常机制使用了三个新的关键字:
1>try 标识可能出现的异常代码段
2>throw 抛出一个异常
3>标识处理异常的代码段
捕获异常的基本语法如下:
抛出异常
throw
throw必须在 try代码块中.后边跟的值决定抛出异常的类型。
捕获异常
catch
出现在try代码块后,后边跟的数据决定捕获的类型
catch(...) //表示捕获所有异常,包括C++语言提供所有的原生数据类型的异常对象,如int、double,还有char*、int*这样的指针类型,另外还有数组类型的异常对象。同时也包括所有自定义的抽象数据类型(如:类)。
try
{
// Do something.
// Throw an exception on error.
}
catch
{
// Do whatever.
}
举例说明:
try
{
被检查语句
throw 异常
}
catch(异常类型1)
{
进行异常处理的语句1//例如:cout << "除数为0,计算错误!" << endl;//异常处理语句
}
catch(异常类型2)
{
进行异常处理的语句2
}
实例:
template <typename T>
T Div(T x, T y)
{
if (y == 0)
throw y;
return x / y;
}
int main()
{
int x = 5, y = 2;
double x1 = 5.5, y1 = 0.0;
try
{
//被检查的语句
cout << x << "/" << y << "=" << Div(x, y) << endl;
cout << x1 << "/" << y1 << "=" << Div(x, y) << endl;
}
catch (int)//异常类型
{
cout << "除数为0,计算错误!" << endl;//异常处理语句
}
catch (double)//异常类型
{
cout << "除数为0,计算错误!" << endl;//异常处理语句
}
return 0;
}
上面是捕获的是int double除法出错的例子,其他错误怎么办呢,现在就需要知道其他c++的异常类型,我现在已知的
包括int、double(分别的)、exception(所有的)n等等类型。
异常类继承层级结构图如下:
每条 try 语句至少要有一条配对的 catch 语句。
必须定义 catch 语句以便让它接收一个特定类型的参数。
C++还允许我们定义多条 catch 语句,让每条 catch 语句分别对应着一种可能的异常类型:
catch(int e){ … }
catch(bool e){ … }
catch(…){ … } //字符串、指针等类型
最后一条 catch 语句可以捕获任何类型的异常。
在程序里,我们可以用 throw 保留字来抛出一个异常:throw 1;
在某个 try 语句块里执行过 throw 语句,它后面的所有语句(截止到这个 try 语句块末尾)将永远不会被执行。
与使用一个条件语句或 return 语句相比,采用异常处理机制的好处是它可以把程序的正常功能和逻辑与出错处理部分清晰地划分开而不是让它们混杂在一起。
异常的基本原则是:应该只用它们来处理确实可能不正常的情况。例如:除数为0。
作为一条原则,在构造器和析构器里不应该使用异常。
如果 try 语句块无法找到一个与之匹配的 catch 语句块,它抛出的异常将中止程序的执行。
在C++标准库里有个一名为 exception 的文件,该文件声明了一个 exception 的基类。可以用这个基类来创建个人的子类以管理异常。有经验的程序猿常常这么做,而如此抛出和捕获的是 exception 类或其子类的对象。
如果你打算使用对象作为异常,请记住这样一个原则:以”值传递”方式抛出对象,以”引用传递”方式捕获对象。
有关捕获异常其它一些资料可以直接点击这里:
http://blog.csdn.net/thefutureisour/article/details/7767252