1.2 抛出异常

如果在程序的代码中出现了异常的情况—也就是说,通过当前语境无法获得足够的信息以决定应该采取什么样的措施—程序员可以创建一个包含错误信息的对象并把它抛出当前语境,通过这种方式将错误信息发送到更大范围的语境中。这种方式被称为“抛出一个异常”。如下所示:

1.2 抛出异常 - 图1

在上面的代码中,MyError是一个普通的类,它的构造函数接受一个char*类型的变量作为参数。在抛出一个异常时,可以使用任意的类型(包括内置类型),但通常应当为抛出的异常创建特定的类。

关键字throw将导致一系列事情的发生。首先,它将创建程序所抛出的对象的一个拷贝,然后,实际上,包含throw表达式的函数返回了这个对象,即使该函数原先并未设计为返回这种对象类型。一种简单的考虑异常处理的方式是将其看做是一种交错返回机制(alternate return mechanism)(如果仔细分析这个问题,就会发现自己陷入了困境)。当然也可以通过抛出一个异常而离开正常的作用域。在任何一种情况下都会返回一个值,并且退出函数或作用域。

由于异常会造成程序返回到某个地方,而这个地方与正常函数调用时遇到return语句后程序返回到的地方完全不同,所以异常与return语句的相似性仅止于此。(可以在程序中恰当的部分编写异常处理器代码,这段代码可能与异常抛出的位置相差很远。)另外,异常发生之前创建的局部对象被销毁。这种对局部对象的自动清理通常被称为“栈反解(stack unwinding)”。

而且,在程序中可以抛出许多程序员希望的不同类型的对象。典型的做法是,程序员要为每一种不同的异常情况抛出不同类型的对象。这么做的目的是将错误信息保存在相应的对象和对象类名中,这样,在调用者的语境中根据这些信息就可以决定应该如何处理这些异常了。