多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
标准库中也提供了很多的异常类,它们是通过类继承组织起来的。异常类继承层级结构图如下: ![](https://img.kancloud.cn/dc/c7/dcc7b08e7e128cad67049c4f7c3285e8_775x496.png) 标准异常类的成员: ① 在上述继承体系中,每个类都有提供了构造函数、复制构造函数、和赋值操作符重载。 ② `logic_error`类及其子类、`runtime_error`类及其子类,它们的构造函数是接受一个string类型的形式参数,用于异常信息的描述 ③ 所有的异常类都有一个what()方法,返回const char* 类型(C风格字符串)的值,描述异常信息。 **标准异常类的具体描述:** | 异常名称 | 描述 | | --- | --- | | exception | 所有标准异常类的父类 | | `bad_alloc` | 当`operator new and operator new[]`,请求分配内存失败时 | | `bad_exception` | 这是个特殊的异常,如果函数的异常抛出列表里声明了`bad_exception`异常,当函数内部抛出了异常抛出列表中没有的异常,这是调用的unexpected函数中若抛出异常,不论什么类型,都会被替换为`bad_exception`类型 | | bad_typeid | 使用typeid操作符,操作一个NULL指针,而该指针是带有虚函数的类,这时抛出`bad_typeid`异常 | | `bad_cast` | 使用`dynamic_cast`转换引用失败的时候 | | `ios_base::failure` | io操作过程出现错误 | | `logic_error` | 逻辑错误,可以在运行前检测的错误 | | runtime_error | 运行时错误,仅在运行时才可以检测的错误 | **logic_error的子类:** | 异常名称 | 描述 | | --- | --- | | `length_error` | 试图生成一个超出该类型最大长度的对象时,例如vector的resize操作 | | `domain_error` | 参数的值域错误,主要用在数学函数中。例如使用一个负值调用只能操作非负数的函数 | | `out_of_range` | 超出有效范围 | | `invalid_argument` | 参数不合适。在标准库中,当利用string对象构造bitset时,而string中的字符不是’0’或’1’的时候,抛出该异常 | **runtime_error的子类:** | 异常名称 | 描述 | | --- | --- | | `range_error` | 计算结果超出了有意义的值域范围 | | `overflow_error` | 算术计算上溢 | | `underflow_error` | 算术计算下溢 | | `invalid_argument` | 参数不合适。在标准库中,当利用string对象构造bitset时,而string中的字符不是’0’或’1’的时候,抛出该异常 | ~~~ #include <stdexcept> //2013的vs以上可以不用 class Maker { public: int age; public: Maker(int age) { if (age<0 || age>150) { throw out_of_range("年龄不在访问范围内"); } else { this->age = age; } } }; void test01() { try { Maker m(-1); } catch (out_of_range &ex) { cout << ex.what() << endl; } } ~~~