예외 필터를 작성합니다.
예외는 예외 처리기의 수준으로 이동 또는 실행을 계속 처리할 수 있습니다.사용할 수 있는 예외 처리기 코드를 사용 하 여 예외 및 try-finally를 처리 하는 대신 필터 문제를 정리 하 고 다음에 – 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을 평가 하는 필터를 수도 더 유용 합니다.
쉼표 연산자 다 수행할 수 있습니다 독립적인 작업 내의 단일 식입니다.약 효과를 여러 개의 문을 실행 하 고 다음 마지막 식의 값입니다.예를 들어, 다음 코드는 예외 코드를 변수에 저장 하 고 테스트 한 다음:
__except( nCode = GetExceptionCode(), nCode == STATUS_INTEGER_OVERFLOW )