다음을 통해 공유


프레임 기반 예외 처리

프레임 기반 예외 처리기 사용하면 특정 코드 시퀀스에서 예외가 발생할 수 있는 가능성을 처리할 수 있습니다. 프레임 기반 예외 처리기는 다음 요소로 구성됩니다.

  • 보호된 코드 본문
  • 필터 식
  • 예외 처리기 블록

프레임 기반 예외 처리기는 언어별 구문으로 선언됩니다. 예를 들어 Microsoft C/C++ 최적화 컴파일러에서는 __try__except사용하여 구현됩니다. 자세한 내용은 처리기 문법를 참조하세요.

보호된 코드 본문은 필터 식과 예외 처리기 블록이 예외 처리 보호를 제공하는 하나 이상의 문장 집합입니다. 보호된 본문은 코드 블록, 중첩된 블록 집합 또는 전체 프로시저 또는 함수일 수 있습니다. Microsoft C/C++ 최적화 컴파일러를 사용하여 보호된 본문은 __try 키워드에 따라 중괄호({})로 묶입니다.

프레임 기반 예외 처리기의 필터 식는 보호된 본문 내에서 예외가 발생할 때 시스템에 의해 평가되는 식입니다. 이 평가는 시스템에서 다음 작업 중 하나를 수행합니다.

  • 시스템은 예외 처리기에 대한 검색을 중지하고, 컴퓨터 상태를 복원하고, 예외가 발생한 지점에서 스레드 실행을 계속합니다.
  • 시스템은 예외 처리기에 대한 검색을 계속합니다.
  • 시스템은 예외 처리기로 제어를 전송하고, 예외 처리기가 있는 스택 프레임에서 스레드 실행이 순차적으로 계속됩니다. 처리기가 예외가 발생한 스택 프레임에 없는 경우 시스템은 스택을 해제하고, 예외 처리기의 스택 프레임으로 돌아갈 때까지 현재 스택 프레임과 다른 스택 프레임을 그대로 둡니다. 예외 처리기를 실행하기 전에 제어를 예외 처리기로 전송한 결과로 종료된 모든 보호된 코드 본문에 대해 종료 처리기가 실행됩니다. 종료 처리기에 대한 자세한 내용은 종료 처리참조하세요.

필터 식은 간단한 식이거나 예외를 처리하려고 시도하는 필터 함수 호출할 수 있습니다. 필터 식 내에서 GetExceptionCode 호출하고 GetExceptionInformation함수를필터링되는 예외에 대한 정보를 가져올 수 있습니다. GetExceptionCode 예외 유형을 식별하는 코드를 반환하고 GetExceptionInformationCONTEXTEXCEPTION_RECORD 구조체에 대한 포인터가 포함된 EXCEPTION_POINTERS 구조체에 대한 포인터를 반환합니다.

이러한 함수는 필터 함수 내에서 호출할 수 없지만 반환 값은 필터 함수에 매개 변수로 전달될 수 있습니다. GetExceptionCode 예외 처리기 블록 내에서 사용할 수 있지만 GetExceptionInformation 가리키는 정보는 일반적으로 스택에 있으며 컨트롤이 예외 처리기로 전송될 때 제거되기 때문에 사용할 수 없습니다. 그러나 애플리케이션은 안전한 스토리지에 정보를 복사하여 예외 처리기에서 사용할 수 있도록 할 수 있습니다.

필터 함수의 장점은 예외를 처리하고 예외가 발생한 지점에서 시스템이 실행을 계속하도록 하는 값을 반환할 수 있다는 것입니다. 반면 예외 처리기 블록을 사용하면 예외 지점이 아닌 예외 처리기에서 순차적으로 실행이 계속됩니다.

예외 처리는 오류를 표시하고 나중에 검사할 플래그를 설정하거나, 경고 또는 오류 메시지를 인쇄하거나, 다른 제한된 작업을 수행하는 것만큼 간단할 수 있습니다. 실행을 계속할 수 있는 경우 컨텍스트 레코드를 수정하여 컴퓨터 상태를 변경해야 할 수도 있습니다. 페이지 오류 예외를 처리하는 필터 함수의 예는 Virtual Memory Functions사용합니다.

UnhandledExceptionFilter 함수는 필터 식에서 필터 함수로 사용할 수 있습니다. 프로세스가 디버그되지 않는 한 EXCEPTION_EXECUTE_HANDLER 반환하며, 이 경우 EXCEPTION_CONTINUE_SEARCH 반환합니다.