概述
VMS操作系统设计了一个异常分派程序(the exception dispatcher),这个程序负责调用帧的栈异常处理扫描。按如下步骤进行:
第一步,首先扫描了主异常向量(primary exception vector),它是在异常发生时正在执行的程序访问模式的条件下进行的。
第二步,扫描次异常向量(secondary exception vector),它是在异常发生时正在执行的程序访问模式的条件下进行的。
第三步,扫描异常发生时正在执行程序访问模式的过程调用栈中所指示的异常处理程序的地址,在调用栈中的扫描根据调用帧中的FP指示的方向进行。
第四步,扫描压轴异常向量(the last chance exception vector),它是在异常发生时正在执行程序的访问模式的条件下进行的。
当异常分派程序找到一个条件处理程序时便终止。如果分派程序没有找到User Handler,它将调用在压轴异常向量中存放地址指向的条件处理程序(往往是“垃圾箱处理程序”)。从这个过程中看出:如果用户指定异常处理,它将设置在比缺省异常处理优先找到的位置。1
表达式编程人员可以进行选择,如果异常发生在try模块中,异常过滤程序就被求值,异常过滤程序是一个结果必须为下列三个选项之一的表达式:
1、过滤程序取值为1(EXCEPTION-EXECUTE-HANDLER),则“接受”异常。从而指示分派程序调用异常处理程序。过滤程序取值为1,除了传入EXCEPTl0N—EXECUTE-HANDLER以外,还可以有别的方法。例如GetExceptionCode函数提取引起except模块执行的异常。
2、取消异常,如果过滤程序取值为一1(EXCEPTION—CONTINUE-EXECUTION),这意味着,编程人员已经对异常发生的原因有所处理。在这种情况下,异常分派程序从上下文记录中恢复机器状态,并由引发异常处开始执行代码。
3、0值(EXCEPTION—CONTINUE SEARCH)意味着编程人员不希望处理异常。在这种情况下,异常分派程序搜寻另一个处理程序来处理异常。这是对的,编程人员可以有一个以上的异常处理程序,如果不处理异常,异常分派程序通过逆向搜寻调用堆栈查找另一个异常处理程序。如果异常分派程序没有找到一个愿意取值为EXCEPTION—EXECUTEHANDLER的处理程序,它将被认为是未处理的异常。2