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
这样子就不需要每次都根据异常代码查找错误原因。