다음을 통해 공유


예외 필터 작성

예외 처리기의 수준으로 이동하거나 계속 실행하여 예외를 처리할 수 있습니다. 예외 처리기 코드를 사용하여 예외를 처리하는 대신 필터 식을 사용하여 문제를 클린 수 있습니다. 그런 다음(-1)을 반환하여 스택을 EXCEPTION_CONTINUE_EXECUTION 지우지 않고 정상적인 흐름을 다시 시작할 수 있습니다.

참고 항목

일부 예외는 계속할 수 없습니다. 이러한 예외에 대해 필터가 -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 . 이 함수는 문의 필터 식 __except 내에서 호출해야 합니다. Eval_Exception 는 호출 GetExceptionCode할 수 없지만 예외 코드가 전달되어야 합니다.

이 처리기는 예외가 정수 또는 부동 소수점 오버플로가 아닌 경우 제어를 다른 처리기에 전달합니다. 그럴 경우 처리기는 함수(ResetVars가 유일한 예이며, API 함수가 아님)를 호출하여 일부 전역 변수를 다시 설정합니다. 이 예제에서 비어 있는 문 블록은 __except (1)을 Eval_Exception 반환 EXCEPTION_EXECUTE_HANDLER 하지 않으므로 실행할 수 없습니다.

함수 호출 사용은 복잡한 필터 식을 처리하는 좋은 일반 용도의 기술입니다. 유용한 두 개의 다른 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 )

참고 항목

예외 처리기 작성
Structured Exception Handling (C/C++)