다음을 통해 공유


프레임 기반 예외 처리

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

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

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

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

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

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

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

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

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

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

UnhandledExceptionFilter 함수는 필터 식에서 필터 함수로 사용할 수 있습니다. 프로세스가 디버그되지 않으면 EXCEPTION_EXECUTE_HANDLER 반환하고, 디버그되면 EXCEPTION_CONTINUE_SEARCH를 반환합니다.