예외 처리기 구문

__try__except 키워드는 프레임 기반 예외 처리기를 생성하는 데 사용됩니다. 다음 예제에서는 예외 처리기의 구조를 보여줍니다.

__try 
{
    // guarded body of code 
 
} 
__except (filter-expression) 
{ 
    // exception-handler block 
 
}

__try 블록과 예외 처리기 블록에는 중괄호({})가 필요합니다. goto 문을 사용하여 __try 블록의 본문으로 이동하거나 예외 처리기 블록으로 이동할 수 없습니다. 이 규칙은 예외 처리기와 종료 처리기 모두에 적용됩니다.

__try 블록에는 예외 처리기가 보호하는 보호된 코드 본문이 포함됩니다. 함수에는 여러 예외 처리기가 있을 수 있으며 이러한 예외 처리 문은 동일한 함수 또는 다른 함수 내에 중첩될 수 있습니다. __try 블록 내에서 예외가 발생하면 시스템이 제어권을 차지하고 예외 처리기 검색을 시작합니다. 이 검색에 대한 자세한 설명은 예외 처리를 참조하세요.

예외 처리기는 단일 스레드 내에서 발생하는 예외만 수신합니다. 즉 __try 블록에 CreateProcess 또는 CreateThread 함수에 대한 호출이 포함된 경우 새 프로세스 또는 스레드 내에서 발생하는 예외는 이 처리기에 디스패치되지 않습니다.

시스템은 예외가 처리되거나 더 이상 처리기가 없을 때까지 예외가 발생한 코드를 보호하여 각 예외 처리기의 필터 식을 평가합니다. 필터 식은 다음 세 가지 값 중 하나로 평가되어야 합니다.

의미
EXCEPTION_EXECUTE_HANDLER 시스템은 예외 처리기에 컨트롤을 전송하고 처리기가 있는 스택 프레임에서 실행이 계속됩니다.
EXCEPTION_CONTINUE_SEARCH 시스템은 처리기를 계속 검색합니다.
EXCEPTION_CONTINUE_EXECUTION 시스템은 처리기에 대한 검색을 중지하고 예외가 발생한 지점으로 컨트롤을 반환합니다. 예외를 계속할 수 없는 경우 EXCEPTION_NONCONTINUABLE_EXCEPTION 예외가 발생합니다.

 

예외가 다른 함수에서 발생했을 수 있더라도 필터 식은 예외 처리기가 있는 함수의 컨텍스트에서 평가됩니다. 즉, 필터 식은 함수의 로컬 변수에 액세스할 수 있습니다. 마찬가지로 예외 처리기 블록은 해당 블록이 있는 함수의 로컬 변수에 액세스할 수 있습니다.

자세한 예제는 예외 처리기 사용을 참조하세요.

필터 식 및 필터 함수에 대한 자세한 내용은 프레임 기반 예외 처리를 참조하세요.