Поделиться через


Создать фильтр исключения

Можно обработать исключения или переходе к уровню обработчика исключений или продолжить выполнение.Вместо этого использовать Код обработчика исключений для обработки исключения и падать до конца, можно использовать Фильтр очистить проблему и затем путем возвращения - 1, возобновляет обычную файла без очистки стека.

ПримечаниеПримечание

Некоторые исключения нельзя продолжить.If Фильтр вычисляет - 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), чтобы сбросить некоторые глобальные переменные. Statement-block-2, который в данном примере пуст, может не быть выполнен, поскольку Eval_Exception никогда не возвращает EXCEPTION_EXECUTE_HANDLER (1).

Хороший метод общего назначения с помощью вызова функции ведения дела со сложными выражениями фильтра.2 Других функций языка c, которые полезны:

  • Условный оператор

  • Оператор " запятая "

Условный оператор часто полезен, поскольку его можно использовать для проверки для конкретного кода возврата, а затем возвратить одно из 2 различных значений.Например, фильтр в следующем Коде распознает исключение, только если исключение 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++)