6.13 try块和异常处理
throw表达式(throw expression),错误检测部分使用这种表达式来说明遇到了不可处理的错误。可以说,throw引发(raise)了异常条件。
try块(try block),错误处理部分使用它来处理异常。try语句块以try关键字开始,并以一个或多个catch子句(catch clause)结束。在try块中执行的代码所抛出(throw)的异常,通常会被其中一个catch子句处理。由于它们“处理”异常,catch子句也称为处理代码(handler).
由标准库定义的一组异常类(expression class),用来throw和相应的catch之间传递有关的错误信息。
6.13.2 try块
抛出一个异常时,如果不存在处理异常的catch块,程序的运行就要跳转到名为terminate的标准库函数,该函数在exception头文件中定义。这个标准库函数的行为依赖于系统,通常情况下,它的执行将导致程序非正常退出。
6.13.3 标准异常
标准库异常类定义在四个头文件中:
(1) exception头文件中定义了最常见的异常类,它的类名是exception。
(2) stdexcept头文件定义了几种常见的异常类。
(3) new 头文件定义了bad_alloc异常类型,提供因无法分配内存而由new抛出的异常。
(4) type_info 头文件定义了bad_cast异常类型。
异常类型定义了一个名为what的操作。这个函数不需要任何参数,并且返回const char*类型的值。它返回的指针指向一个C风格字符串。使用C风格字符串的目的是为所抛出的异常提供更详细的文字描述。
对于接受string初始化式的异常类型,what函数将返回该string作为C风格字符数组。
6.14 使用预处理器进行调试
另一个常见的调试技术是使用NDEBUG预处理变量以及assert(断言)预处理宏(preprocessor macro)。assert宏是在cassert头文件中定义的,所有使用assert的文件都必须包含这个头文件。
预处理宏有点像函数调用。assert宏需要一个表达式作为它的条件。
#include <cassert>
assert(2>1);
assert(2<1);
Assertion failed: 2<1, file c:\documents and settings\10170660\my documents\visu
al studio 2010\projects\cplusplusproj\cplusplusproj\cplusplusproj.cpp, line 21