您的位置:首页 > 编程语言 > C语言/C++

C++中异常处理中的异常重新抛出的一种用法

2016-09-08 21:56 281 查看
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

这样子就不需要每次都根据异常代码查找错误原因。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 异常处理