持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第33天,点击查看活动详情
1️⃣前言
今天的笔记内容:
- C++的标准异常库
2️⃣概述
C++ 提供了一系列以父子类层次结构组织起来的,标准的异常,且定义在<exception>中,我们可以在程序中使用这些标准异常。
C++标准异常库继承层次图如下所示:
具体说明如下:
| 异常 | 描述 |
|---|---|
exception | 所有标准C++异常类的父类 |
bad_alloc | 该异常可以通过new抛出(请求分配内存失败时) |
bad_exception | 这个异常比较特殊,其在处理C++程序中无法预期的异常时非常有用 |
bad_typeid | 该异常可以通过typeid抛出(使用typeid操作符,操作一个NULL指针,而该指针是带有虚函数的类,这时会抛出bad_typeid异常) |
bad_cast | 该异常可以通过dynamic_cast抛出(即使用dynamic_cast转换引用失败的时候) |
logic_error | 逻辑错误,是理论上可以通过读取代码来检测到的异常(即运行前检测的错误) |
ios_base::failure | IO操作出现错误 |
runtime_error | 运行时错误,仅在运行时才可以检测的错误 |
length_error | 当创建了太长的std::string时,会抛出该异常。比如vector的resize操作 |
domain_error | 主要用在数学函数中,当使用了一个无效的数学域时(参数的值域错误),则会抛出该异常 |
out_of_range | 超出有效范围 |
invalid_argument | 当使用了无效的参数时,会抛出该异常(在标准库中,当利用string对象构造bitset时,而string中的字符不是'1'或'0'的时候,抛出该异常) |
range_error | 当尝试存储超出范围的值时(计算结果超出有意义的值域范围时),会抛出该异常 |
overflow_error | 当发生数学上溢(算术计算),会抛出该异常 |
underflow_error | 当发生数学下溢(算术计算),会抛出该异常 |
在上面这个表格中,每个异常类都有构造函数,拷贝构造函数和赋值操作符的重载。logic_error类及其子类、runtime_error类及其子类,他们的构造函数都是接受一个string类型的形式参数,用于异常信息的描述,而所有异常类都有一个what()方法,返回const char*类型的值,用于描述异常信息。
3️⃣写在最后
好了,今天的笔记就到这里。