Создать фильтр исключения
Можно обработать исключения или переходе к уровню обработчика исключений или продолжить выполнение.Вместо этого использовать Код обработчика исключений для обработки исключения и падать до конца, можно использовать Фильтр очистить проблему и затем путем возвращения - 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 )