关于C++异常对象的几点理解
1、什么可以作为异常对象?
异常对象并不像我之前想象的那么复杂,反之,C++异常对象时非常简单的。异常对象可以分为以下几类
(1)C++的内置类型对象可以作为异常对象。比如:int、double
(2)C++的标准库中定义的异常对象(类类型)
标准异常类 | 描述 | 头文件 |
---|---|---|
exception | 最通用的异常类,只报告异常的发生而不提供任何额外的信息 | exception |
runtime_error | 只有在运行时才能检测出的错误 | stdexcept |
rang_error | 运行时错误:产生了超出有意义值域范围的结果 | stdexcept |
overflow_error | 运行时错误:计算上溢 | stdexcept |
underflow_error | 运行时错误:计算下溢 | stdexcept |
logic_error | 程序逻辑错误 | stdexcept |
domain_error | 逻辑错误:参数对应的结果值不存在 | stdexcept |
invalid_argument | 逻辑错误:无效参数 | stdexcept |
length_error | 逻辑错误:试图创建一个超出该类型最大长度的对象 | stdexcept |
out_of_range | 逻辑错误:使用一个超出有效范围的值 | stdexcept |
bad_alloc | 内存动态分配错误 | new |
bad_cast | dynamic_cast类型转换出错 | type_info |
除了抛出用户自定义的类型外,C++标准库定义了一组类,用户报告标准库函数遇到的问题。这些标准库异常类只定义了几种运算,包括创建或拷贝异常类型对象,以及为异常类型的对象赋值。
(3)自定义的类类型的对象
2、异常对象的特殊之处
存储比较特殊,它不存储在堆内存中,又不存储在栈内存中。在windows下它存储在线程块TIB中。
3、类类型的异常对象的特点?
其名称往往代表了异常的类型。
4、异常对象如何存储到特殊的内存块中?
操作系统会根据throw+表达式构成的throw语句,使用复制构造函数将一份该类型的数据存储在特殊内存中。
5、异常对象的作用是什么?
起到一个信息匹配的功能,即将存在特殊内存中的异常对象与对应的catch进行信息匹配,然后决定执行哪个catch的代码。