background image

                   C

   

语言编译器如何实现异常处理

与传统语言相比,C++的一项革命性创新就是它支持异常处理。传统的错误处理方式经常

满足不了要求,而异常处理则是一个极好的替代解决方案。它将正常代码和错误处理代码

清晰的划分开来,程序变得非常干净并且容易维护。本文讨论了编译器如何实现异常处理。

我将假定你已经熟悉异常处理的语法和机制。本文还提供了一个用于 VC++的异常处理库,

要用库中的处理程序替换掉 VC++

 

提供的那个,你只需要调用下面这个函数:

install_my_handler();

之后,程序中的所有异常,从它们被抛出到堆栈展开(stack unwinding),再到调用

catch 块,最后到程序恢复正常运行,都将由我的异常处理库来管理。

与其它 C++特性一样,C++标准并没有规定编译器应该如何来实现异常处理。这意味着每

一个编译器的提供商都可以用它们认为恰当的方式来实现它。下面我会描述一下 VC++是

怎么做的,但即使你使用其它的编译器或操作系统①,本文也应该会是一篇很好的学习

材料。VC++的实现方式是以 windows 系统的结构化异常处理(SEH)②

 

为基础的。

结构化异常处理 概述

在本文的讨论中,我认为异常或者是被明确的抛出的,或者是由于除零溢出、空指针访问

等引起的。当它发生时会产生一个中断,接下来控制权就会传递到操作系统的手中。操作

系统将调用异常处理程序,检查从异常发生位置开始的函数调用序列,进行堆栈展开和

控制权转移。Windows

定义了结构 EXCEPTION_REGISTRATION”,使我们能够向操作系

 

统注册自己的异常处理程序。

struct EXCEPTION_REGISTRATION

{

    EXCEPTION_REGISTRATION* prev;

    DWORD handler;

};