3. 自定义异常类型
上述示例中我们使用 const char * 类型的错误信息来表示 索引超出范围这样的一种错误,这种方法虽然可行,当容易产生混乱,因此 C++ 建议为每一种错误定义一种专门表式此种错误的类型。这样便于区分和处理。
以下自定义 RangeError 类型的错误来描述 MyRange 类索引超出范围这样类型的错误如下:
class RangeError {
public:
RangeError(const std::string &msg) : message(msg) {}
const std::string & get_message() const {return message;}
private:
std::string message;
};
示例
以下是完整的代码
/ filename: custom_excep_type.cpp
#include <iostream>
class RangeError {
public:
RangeError(const std::string &msg) : message(msg) {}
const std::string & get_message() const {return message;}
private:
std::string message;
};
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 RangeError("索引不能为负数值");
if (step > 0 && value > stop)
throw RangeError("索引越界");
else if (step < 0 && value < stop)
throw RangeError("索引越界");
return value;
}
private:
int start;
int stop;
int step;
};
int main(int argc, char * argv[]) {
MyRange r2(1, 10, 3); // 生成 1、4、7
try{
std::cout << r2[0] << std::endl; // 打印 1
std::cout << r2[1] << std::endl; // 打印 4
std::cout << r2[-1] << std::endl; // 抛处 RangeError 类型的错误
std::cout << r2[100] << std::endl; // 抛处 RangeError 类型的错误
}
catch (const RangeError &err) {
std::cout << "捕获 RangeError 类型的错误: " << err.get_message()
<< std::endl;
std::cout << "错误已经处理,程序进入正常状态!" << std::endl;
}
catch (...) {
std::cout << "捕获其他类型的错误并处理" << std::endl;
}
printf("程序正常退出!\n");
return 0;
}
编译和运行结果如下:
weimz@mzstudio:~$ g++ -o custom_excep_type custom_excep_type.cpp
weimz@mzstudio:~$ ./custom_excep_type
1
4
捕获 RangeError 类型的错误: 索引不能为负数值
错误已经处理,程序进入正常状态!
程序正常退出!