首页 理论教育 异常分类及处理|C++STL标准模板库异常解析

异常分类及处理|C++STL标准模板库异常解析

时间:2023-10-25 理论教育 版权反馈
【摘要】:通过异常处理,C++标准程序库可以在“不污染”函数接口的情况下处理异常。一旦遭遇异常,通过“抛出异常”停止正常的处理过程。语言本身支持的或标准程序库所抛出的所有异常均派生自基类exception。类Exception是多个标准异常类的基类,与其他标准异常类共同构成类的体系。此类异常多用于支撑某些语言的特性。逻辑错误通常指的是包括违背逻辑前提或违反类的不变性。第三种异常是程序作用域之外发生的异常。

异常分类及处理|C++STL标准模板库异常解析

通过异常处理,C++标准程序库可以在“不污染”函数接口的情况下处理异常。一旦遭遇异常,通过“抛出异常”停止正常的处理过程。语言本身支持的或标准程序库所抛出的所有异常均派生自基类exception。

类exception的声明:

其中包含了两个构造函数,这两个构造函数全部包括异常描述(后面讲述),还包括了一个右侧赋值操作符、一个虚析构函数和一个what()虚函数。

类Exception是多个标准异常类的基类,与其他标准异常类共同构成类的体系。标准异常类通常分为以下3种:

1)语言本身支持的异常。

2)C++ STL所抛出的异常。

3)程序作用域之外发出的异常。

第一种异常是语言本身支持的异常。此类异常多用于支撑某些语言的特性。此类异常处理不是STL的一部分,而是核心语言的内容。一旦操作失败,会抛出异常。例如,全局操作符new一旦操作失败,会抛出bad_alloc异常。在较复杂的程序中,尤其在大量使用操作符new的程序中,此类异常可能会随时发生,是一种非常重要的异常。程序执行时,当加诸于reference身上的“动态型别转换操作”失败时,动态dynamic_cast通常会抛出bad_cast异常。对于型别辨识过程,赋予typeid的参数一旦是零或空指针,typeid会抛出bad_typeid异常。值得一提的是对于发生非预期的异常,bad_exception异常会即时处理。此时通常bad_exception会调用unexpected()函数。

类bad_alloc的声明形式如下:

类bad_cast的声明形式如下:

第二种异常是C++标准程序库所发生的异常。C++标准程序库异常总是派生自类logic_error。从理论上讲,能够通过一些手段使程序避免逻辑错误。逻辑错误通常指的是包括违背逻辑前提或违反类的不变性。C++标准程序库提供4个逻辑错误类别,分别是:invalid_argu-ment、length_error、out_of_range和domain_error。

类logic_error的声明形式如下:

上述类logic_error的构造器的参数string&message用于描述异常的信息,以便于在使用what()函数时,返回该message。下同。

类invalid_argument通常表示无效参数,例如使用char类型对bitset初始化。该类的声明形式如下:(www.xing528.com)

类length_error通常指某个行为“可能超越了最大极限”,例如字符串中字符数目过多。该类的声明形式如下:

类out_of_range通常指参数值“不在预期范围内”,例如在array型容器中或字符串中采用错误的索引。该类的声明形式如下:

类domain_error通常指专业领域内的错误。该类的声明形式如下:

STL的I/O部分提供了名为ios_base::failure的特殊异常。数据流因错误或到达文件末尾而发生状态改变时,可能会抛出异常。

由于标准程序库会用到语言特性及客户所写的程序代码,可能间接抛出任何异常。尤其是何时分配存储空间,都有可能抛出bad_alloc异常。

标准程序库任何具体的实例化类及其对象,都可能提供额外的异常类别。使用非标准类别将导致程序无法移植。必要时需要非常痛苦地修改源程序,因此使用标准异常是非常必要的。

第三种异常是程序作用域之外发生的异常。派生自类runtime_error的异常,用来指出“不在程序范围内,且不容易回避”的事件。C++标准程序库对“执行期错误”提供了3个类:

类range_error用以实现指出内部计算时发生区间错误。该类的声明形式如下:

类overflow_error用以实现指出算术运算发生上溢位。该类的声明形式如下:

类underflow_error用以实现指出算术运算发生下溢位。该类的声明形式如下:

类runtime_error的声明形式如下:

使用标准异常类时,需要包含头文件<exception>、<new>、<typeinfo>、<ios>和<stdexcept>。头文件中<exception>中包含了类exception和类bad_exception的定义声明。类bad_alloc在头文件<new>中声明,类bad_cast和类bad_typeid在头文件<typeinfo>中声明。ios_base::failure声明于头文件<ios>中。其他多数异常声明于头文件<stdexcept>中。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈