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

时间:2021-08-14 00:42:18

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

这样子就不需要每次都根据异常代码查找错误原因。