基于框架的异常处理

【勇芳软件工作室】汉化HomePreviousNext

A 基于帧的异常处理程序是一种机制,通过该机制,开发人员处理某种特定代码序列中可能发生异常的可能性。基于帧的异常处理程序由以下元素组成。

一个守卫的代码体

*一个过滤表达式

*异常处理程序块

基于帧的异常处理程序以语言特定语法声明。例如,在Microsoft C优化编译器中,它们由尝试 - 语句实现。有关Microsoft C异常处理语法的更多信息,请参阅句法.

守卫的代码体是一组或多个语句,过滤器表达式和异常处理程序块为此提供异常处理保护。守卫的身体可以是一个代码块,一组嵌套块,或整个过程或功能。在Microsoft C中,一个守卫的身体由尝试关键字后面的大括号({})括起来。

基于帧的异常处理程序的过滤表达式是一个表达式,当系统在守护身体内发生异常时,该表达式由系统评估。此评估结果是系统执行以下操作之一。

*系统停止搜索异常处理程序,恢复机器状态,并在异常发生的时刻继续执行线程。

*系统继续搜索异常处理程序。

*系统将控制权转移给异常处理程序,线程执行在找到异常处理程序的堆栈框架中依次继续执行。如果处理程序不在异常发生的堆栈框架中,则系统将解开堆栈,保留当前堆栈帧和任何其他堆栈帧,直到它返回到异常处理程序的堆栈帧。在执行异常处理程序之前,终止处理程序将针对由于向异常处理程序传输控制而终止的任何受保护的代码体执行终止处理程序。有关终止处理程序的更多信息,请参阅终止处理.

过滤器表达式可以是一个简单的表达式,也可以调用尝试处理异常的过滤功能.您可以从过滤器表达式中调用GetExceptionCodeGetExceptionInformation函数来获取有关正在过滤的异常的信息。GetExceptionCode返回一个标识异常类型的代码,GetExceptionInformation返回一个指向EXCEPTION_POINTERS结构的指针,其中包含CONTEXTEXCEPTION_RECORD结构的指针。

这些函数不能在一个过滤器函数内调用,但是它们的返回值可以作为参数传递给一个过滤器函数。GetExceptionCode可以在异常处理程序块中使用,但GetExceptionInformation不能因为它指向的信息通常在堆栈中,并且当控件传输到异常处理程序时被破坏。但是,应用程序可以将信息复制到安全存储,以使其可用于异常处理程序。

过滤器功能的优点是它可以处理异常并返回一个值,使得系统从发生异常的点继续执行。与异常处理程序块相反,执行从异常处理程序而不是从异常点继续执行。

处理异常可能很简单,例如注意到错误,并设置稍后检查的标志,打印警告或错误消息,或采取其他有限的措施。如果可以继续执行,也可能需要通过修改上下文记录来更改机器状态。有关处理页面错误异常的过滤器函数的示例,请参阅内存管理.

UnhandledExceptionFilter功能可以用作过滤器表达式中的过滤器函数。它返回EXCEPTION_EXECUTE_HANDLER,除非进程被调试,在这种情况下它返回EXCEPTION_CONTINUE_SEARCH。