C++中使用try...catch语句进行异常的的处理,通过throw语句进行异常的抛出,结构如下:
try
{
throw ...;
}
catch(...)
{
}
这是一般的异常处理的形式,C++中还支持异常的重新抛出,即在catch语句中继续抛出异常,形如:
try
{
throw ...;
}
catch (int i)
{
throw; //此时throw语句后面不需要任何表达式!!
}
为什么要重新抛出异常呢,这有何意义呢?请考虑如下场景
假设存在一个第三方库,我们需要使用自己的函数进行调用,此时就体现出重新抛出异常的意义了;
有如下代码:
#include<string>
#include <iostream>
using namespace std;
/*第三方库中函数 void func(int i)
异常代码 -1:运行时错误
-2:数据超界异常
*/
void func(int i)
{
if(i<0)
throw -1;
if(i>100)
throw -2;
}
int main()
{
try
{
func(199);
}
catch (int i)
{
cout<<"Error Code: "<<i<<endl;
}
return 0;
}
运行结果如下:
Error Code: -2
此时我们根本不知道-2代表什么意思,只能去查找函数的手册,不仅麻烦,而且不直观。但是假如代码如下:
#include<string>
#include <iostream>
using namespace std;
/*第三方库中函数 void func(int i)
异常代码 -1:运行时错误
-2:数据超界异常
*/
void func(int i)
{
if(i<0)
throw -1;
if(i>100)
throw -2;
}
//这是我们自己的库。调用第三方库的函数void func(int i)
void myFunc(int i)
{
try
{
func(i);
}
catch(int i)
{
switch(i)
{
case -1:
throw "Runtime Error";
break;
case -2:
throw "Data Error";
break;
}
}
}
int main()
{
try
{
myFunc(199);
}
catch (const char *s)
{
cout<<"Error Code: "<<s<<endl;
}
return 0;
}
结果输出如下:
Error Code: Data Error
这样子就不需要每次都根据异常代码查找错误原因。