13.16 标准库异常层次
经验表明,异常是可以分类的。C++ 草案标准提供了标准库异常层次。这个层次以基类 excephon 开始(在头文件 <exception> 中定义),该基类提供服务 what(),在每个派生类中重定义,发出相应的错误消息。
从基类 exception 可以派生直接派生类runtime_error和Iogic_error(都在头文件 <stdexcept> 中定义),每个派生类又可以派生其他类。
从 exception 中还可以派生由于C++语言特性而抛出的异常,例如,new 抛出 bad_alloc(13.14节).dynamic_cast 抛出 bad_cast(第2l章),typeid抛出bad_typeid(第21章)。如果发生意外异常时,通过在函数的抛出表中加上 std::bad_exeeption,unexpected() 抛出 bad_exception 而不是(默认)终止程序或调用set_unexpected指定的另一函数。
logic_error 类是几个标准异常类的基类,表示程序逻辑中的错误,可以通过编写正确的代码来防止。下面介绍其中的一些类。invalid_argument类表示向函数传入无效参数(可以通过编写正确的代码来防止)。length_error 类表示长度大于所操作对象允许的最大长度(第19章处理string时会抛出length_error异常)。out_of_range类表示数组和 string 下标之粪的值超界。
runtime_error 类是几个其他异常类的基类,表示程序中只能在执行时发现的错误。overflow_error类表示发生运算上溢错误;underflow_error类表示发生运算下溢错误。
软件工程视点 13.12
标准 exception 层次只是一个起点.用户可“抛出标准异常、抛出从标准异常派生的异常或抛出不是从标准异常派生的异常。
常见编程错误 13.14
用户自定义异常类不一定从 exception 类派生。 因此 catch(exception) 并井不保证捕获程序可能遇到的各种异常。
测试与调试提示 13. 3
要捕获try块可能抛出的所有异常,用 catch(...)。