예외 필터 작성
예외 처리기의 수준으로 이동하거나 계속 실행하여 예외를 처리할 수 있습니다. 예외 처리기 코드를 사용하여 예외를 처리하는 대신 필터 식을 사용하여 문제를 클린 수 있습니다. 그런 다음(-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 )
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기