常用异常处理关键字
异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。
- throw:出现问题,抛出异常。
- catch捕获异常。放在要处理问题的地方
- try: 放入要保护的代码块,后面通常接多个catch块。
我们通常使用try …catch关键字来处理异常。
其中:try放置可能抛出异常的代码。称为保护代码。
实例:
try
{
// 保护代码
}catch( ExceptionName e1 )
{
// catch 块
}catch( ExceptionName e2 )
{
// catch 块
}catch( ExceptionName eN )
{
// catch 块
}
抛出异常
可以使用throw关键字在任意地方抛出异常。且可以操作任意表达式。表达式的类型决定了抛出异常的类型。
假设我们要做一个除法函数,显然0不能作分母。我们尝试抛出异常:
double division(int a,int b)
{
if(b==0)
{
throw "division by 0 condition!";
}
return (a/b);
}
捕获异常
您可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。
如我们上面例子中:
try
{
// 保护代码
}catch( ExceptionName e )
{
// 处理 ExceptionName 异常的代码
}
代码会捕获一个类型为ExceptionName的异常。
如果你需要捕获任意类型的异常。括号里可以用省略号
即
try{
}catch(...)
{}
下面是一个实例,抛出一个除以零的异常,并在 catch 块中捕获该异常。我们把上面除0异常用throw的函数拿过来。写一个main函数:
注意这里用了cerr对象,常用输出到标准错误,他是一个ofstream对象
#include <iostream>
using namespace std;
int division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}
int main()
{
int x=50,y=0,z=0;
try{
z=division(x,y);
cout<<z<<endl;
}catch(const char& msg)
{
cerr<<msg<<endl;
}
我们throw抛出的 "Division by zero condition!"是const char* 类型的异常,因此捕获时,必须在catch块中使用const char*。
执行时会产生以下结果:
Division by zero condition!
C++标准异常
C++ 提供了一系列标准的异常,定义在 中,我们可以在程序中使用这些标准的异常。它们是以父子类层次结构组织起来的,如下所示:
注意最后这里exception是C++标准异常,而what()是异常类提供的公共方法,被所有子异常类重载。将返回异常产生的原因。
所以我们可以统一这样写:
catch (exception const& why)
{ cerr<<“说明:”<<why.what()<<endl;}