编写异常筛选器

您可以处理异常通过跳转到异常处理程序的级别或继续执行。 而不是用于处理的异常处理程序代码异常和故障,则可以使用 筛选器 将返回清理此问题,然后 – 1,还原未清除堆栈的规则通信。

备注

这些异常无法继续。如果 筛选器 计算 – 1 此类异常的,系统会引发新异常。当您调用 RaiseException时,可以确定异常是否将继续。

例如,下面的代码在 筛选器 表达式中使用函数调用:此函数处理该问题并返回 – 1 继续正常控制流:

// exceptions_Writing_an_Exception_Filter.cpp
#include <windows.h>
int main() {
   int Eval_Exception( int );

   __try {}

   __except ( Eval_Exception( GetExceptionCode( ))) {
      ;
   }

}
void ResetVars( int ) {}
int Eval_Exception ( int n_except ) {
   if ( n_except != STATUS_INTEGER_OVERFLOW && 
      n_except != STATUS_FLOAT_OVERFLOW )   // Pass on most exceptions
   return EXCEPTION_CONTINUE_SEARCH;

   // Execute some code to clean up problem
   ResetVars( 0 );   // initializes data to 0
   return EXCEPTION_CONTINUE_EXECUTION;
}

最好使用函数调用在 筛选器 表达式中,只要 筛选器 需要执行复杂的任何操作。 计算表达式导致该函数的执行,在这种情况下, Eval_Exception。

请注意使用 GetExceptionCode 确定异常。 您必须对筛选器中对此功能。 Eval_Exception 不能调用 GetExceptionCode,但是,它必须与异常代码传递给它。

,除非异常是整数或浮点溢出,此处理程序通过映射到另一个处理程序。 如果是,则调用函数 (ResetVars 只是一个示例,而不是 API 函数) 重新设置几个全局变量。 不要语句块 2,在此示例中为空,可以执行,因为 Eval_Exception 从不返回 EXCEPTION_EXECUTE_HANDLER (1)。

使用函数调用是处理的一个充分常规技术复杂筛选器表达式。 是有用的其他两个 C 语言功能包括:

  • 条件运算符

  • 逗号运算符

,因为它可用于检查特定返回代码然后返回两个不同的值之一,条件运算符通常很有用。 例如,在中,仅当异常是 STATUS_INTEGER_OVERFLOW,如下面的代码的筛选器识别异常:

__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ? 1 : 0 ) {

,如下面的代码产生相同的结果,条件运算符的目的在主将提供清晰:

__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ) {

条件运算符是有用。您可能想让筛选器计算的情况 – 1, EXCEPTION_CONTINUE_EXECUTION。

逗号运算符可以对单个表达式中,多个独立的操作。 该效果大致是执行多个语句并返回最后一个表达式的值。 例如,下面的代码在变量中存储异常代码然后测试它:

__except( nCode = GetExceptionCode(), nCode == STATUS_INTEGER_OVERFLOW )

请参见

参考

编写异常处理程序

结构化异常处理(C++)