15.3.8 exception类(2)
接下来,runtime_error异常系列描述了可能在运行期间发生但难以预计和防范的错误。每个类的名称指出了它用于报告的错误类型:
range_error;
overflow_error;
underflow_error。
每个类独有一个类似于runtime_error的构造函数,让您能够提供一个供方法what( )返回的字符串。
下溢(underflow)错误在浮点数计算中。一般而言,存在浮点类型可以表示的最小非零值,计算结果比这个值还小时将导致下溢错误。整型和浮点型都可能发生上溢错误,当计算结果超过了某种类型能够表示的最大数量级时,将发生上溢错误。计算结果可能不再函数允许的范围之内,但没有发生上溢或下溢错误,在这种情况下,可以使用range_error异常。
一般而言,logic_error系列异常表明存在可以通过编程(www.cppentry.com)修复的问题,而runtime_error系列异常表明存在无法避免的问题。所有这些错误类有相同的常规特征,它们之间的主要区别在于:不同的类名让您能够分别处理每种异常。另一方面,继承关系让您能够一起处理它们(如果您愿意的话)。例如,下面的代码首先单独捕获out_of_bounds异常,然后统一捕获其他logic_error系列异常,最后统一捕获exception异常、runtime_error系列异常以及其他从exception派生而来的异常:
如果上述库类不能满足您的需求,应该从logic_error或runtime_error派生一个异常类,以确保您异常类可归入同一个继承层次结构中。
2.bad_alloc异常和new
对于使用new导致的内存分配问题,C++(www.cppentry.com)的最新处理方式是让new引发bad_alloc异常。头文件new包含bad_alloc类的声明,它是从exception类公有派生而来的。但在以前,当无法分配请求的内存量时,new返回一个空指针。
程序清单15.13演示了最新的方法。捕获到异常后,程序将显示继承的what( )方法返回的消息(该消息随实现而异),然后终止。
程序清单15.13 newexcp.cpp
下面该程序在某个系统中的输出:
在这里,方法what( )返回字符串"std::bad_alloc"。
如果程序在您的系统上运行时没有出现内存分配问题,可尝试提高请求分配的内存量。
3.空指针和new
很多代码都是在new在失败时返回空指针时编写的。为处理new的变化,有些编译器提供了一个标记(开关),让用户选择所需的行为。当前,C++(www.cppentry.com)标准提供了一种在失败时返回空指针的new,其用法如下:
使用这种new,可将程序清单15.13的核心代码改为如下所示: