2. try语句
try语句(也叫 try-catch 语句)用于异常流程的处理,它将尝试捕获异常,并将程序有异常状态转成正常状态(重新进入正常流程)。
语法
try {
可能触发错误的语句。
}
catch (错误类型1 错误对象1) { // catch 子句可以有多个。
处理代码(可以为空)。
}
catch (错误类型2 错误对象2) {
处理代码(可以为空)。
}
catch (...) { // catch... 子句只能有一个且只能放在最后。
}
说明
try { }中用于执行可能出现异常的语句。catch (错误类型 错误对象)根据错误类型依次匹配,如果成功,则被异常被处理,程序恢复正常状态。catch(...)用于捕获任何类型的异常,catch (错误类型 错误对象)子句可以有0个、一个或多个,但只能有一个最先匹配的类型进行捕获异常并处理。catch(...)子句可以有0个或一个且只能放在最后。- 一旦
catch捕获错误,则异常流程中经过的函数的局部变量的析构函数都将被执行。
示例
// filename: try_stat.cpp
#include <iostream>
using namespace std;
class MyRange{
public:
MyRange(int begin, int end, int stp=1): start(begin), stop(end), step(stp) {}
// 重载 [] 运算符
int operator [] (int index) {
int value = start + index * step;
if (index < 0)
throw "索引不能为负数值";
if (step > 0 && value > stop)
throw "索引越界";
else if (step < 0 && value < stop)
throw "索引越界";
return value;
}
private:
int start;
int stop;
int step;
};
int main(int argc, char * argv[]) {
MyRange r2(1, 10, 3); // 生成 1、4、7
try{
cout << r2[0] << endl; // 打印 1
cout << r2[1] << endl; // 打印 4
cout << r2[-1] << endl; // 抛处 const char * 类型的错误
cout << r2[100] << endl; // 抛处 const char * 类型的错误
}
catch (const char * err) {
cout << "捕获 const char * 类型的错误: " << err << endl;
cout << "错误已经处理,程序进入正常状态!" << endl;
}
catch (...) {
cout << "捕获其他类型的错误并处理" << endl;
}
printf("程序正常退出!\n");
return 0;
}
编译和运行结果如下:
weimz@mzstudio:~$ g++ -o try_stat try_stat.cpp
weimz@mzstudio:~$ ./try_stat
1
4
捕获 const char * 类型的错误: 索引不能为负数值
错误已经处理,程序进入正常状态!
程序正常退出!
可见 r2[-1] 内抛出的 const char * 类型的错误被 try 语句收到,并将程序转为正常状态(正常流程)继续向 try 语句后执行。