C/C++编程:错误(error)处理和异常(exception)处理
C++标准程序库由不同的成分构成。来源不同,设计与实现风格迥异。而错误处理和异常处理正是这种差异的一个典型实现。
- 标准程序库中有一部分,例如
std classes
,支持具体的错误处理,他们检测所有可能发生的错误,并于错误发生时抛出异常- 像
STL
,valarrays
等,效率重于安全,因此几乎不检验逻辑错误,并且只在执行期(runtime
)发生错误才抛出异常
标准异常类别(standard exception classes
)
语言本身或者标准程序库所抛出的所有异常,都派生自基类exception
。这些标准异常两步可以分为三组:
- 语言本身支持的异常
- C++标准程序库发出的异常
- 程序作用域之外的异常
所用头文件
#include <exception>
#include <new>
#include <typeinfo>
#include <ios>
#include <stdexcept>
语言本身支持的异常
此类异常用以支撑某些语言特性。
如果以下操作失败,就会抛出这一类的异常:
new
操作失败,bad_alloc
异常- 执行期间,当
reference
上的dynamic_cast
失败时,抛出bad_cast
异常 - 执行期
RTTI
过程中,如果typeid
的参数为0或者空指针,typeid
操作符会bad_typeid
异常 - 如果发生非预期的异常,
bad_exception
异常会接手处理。
C++标准程序库发出的异常
C++标准程序库异常总是派生自logic_error
.
C++标准程序库提供以下逻辑错误类别:
invalid_argument
表示无效参数length_error
指出某些行为“可能超过了最大极限”out_of_range
指出参数值“不在预期范围内”domain_error
指出专业领域范围内的错误。
标准程序库的IO部分提供一个名为ios_base::failure
的特殊异常。当数据流由于错误或由于到达文件尾端而发生状态改变时,就可能抛出这个异常
程序作用域之外的异常
派生自runtime_error
。
用来指出“不在程序范围内,而且不容易回避”的事件
C++标准程序库针对执行期错误提供了如下三个classes
:
range_error
指出内部计算时发生区间错误overflow_error
:算术运算时发生上溢位underflow_error
:算术运算时发生下溢位
建议: 最好只使用标准异常,因为移植性问题
使用
抛出异常
throw std::out_of_range("std::out_of_range");
从标准异常类别(exception classes
)中派生新异常[待补充]
待研究
还没有评论,来说两句吧...