Termination-Handler 구문

__try__finally 키워드는 종료 처리기를 생성하는 데 사용됩니다. 다음 예제에서는 종료 처리기의 구조를 보여 줍니다.

__try 
{ 
    // guarded body of code 
 
} 
__finally 
{ 
    // __finally block 
 
}

예제는 종료 처리기 사용을 참조하세요.

예외 처리기와 마찬가지로 __try 블록과 __finally 블록에는 모두 중괄호({})가 필요하며 goto 문을 사용하여 두 블록으로 이동할 수 없습니다.

__try 블록에는 종료 처리기로 보호되는 코드의 보호된 본문이 포함됩니다. 함수에는 여러 종료 처리기가 있을 수 있으며 이러한 종료 처리 블록은 동일한 함수 내에 또는 다른 함수에 중첩될 수 있습니다.

__finally 블록은 제어 흐름이 __try 블록을 벗어날 때마다 실행됩니다. 그러나 __try 블록 내에서 ExitProcess, ExitThread 또는 abort 함수를 호출하는 경우 __finally 블록이 실행되지 않습니다.

__finally 블록은 종료 처리기가 있는 함수의 컨텍스트에서 실행됩니다. 즉, __finally 블록은 해당 함수의 지역 변수에 액세스할 수 있습니다. __finally 블록의 실행은 다음 수단을 통해 종료할 수 있습니다.

  • 블록에서 마지막 문 실행 및 다음 명령으로 계속
  • 제어 문(return, break, continue 또는 goto) 사용
  • longjmp 사용 또는 예외 처리기로 이동

프레임 기반 예외 처리기의 예외 처리 블록을 호출하는 예외로 인해 __try 블록의 실행이 종료되는 경우 예외 처리 블록이 실행되기 전에 __finally 블록이 실행됩니다. 마찬가지로, __try 블록에서 longjmp C 런타임 라이브러리 함수를 호출하면 longjmp 작업의 대상에서 실행이 다시 시작되기 전에 __finally 블록이 실행됩니다. __try 블록 실행이 제어 문(return, break, continue 또는 goto)으로 인해 종료되면 __finally 블록이 실행됩니다.

__finally 블록 내에서 AbnormalTermination 함수를 사용하여 __try 블록이 순차적으로 종료되었는지(닫는 중괄호(})에 도달했는지) 여부를 확인할 수 있습니다. longjmp 호출이나 예외 처리기로 이동으로 인해 혹은 return, break, continue 또는 goto 문으로 인해 __try 블록을 벗어나는 것은 비정상적인 종료로 간주됩니다. 순차적으로 종료하지 않으면 시스템에서는 모든 스택 프레임을 역순으로 검색하여 종료 처리기를 호출해야 하는지 여부를 확인합니다. 이로 인해 수백 개 명령이 실행되어 성능이 저하될 수 있습니다.

종료 처리기의 비정상적인 종료를 방지하려면 실행이 블록의 끝까지 계속되어야 합니다. __leave 문을 실행할 수도 있습니다. __leave 문을 사용하면 비정상적인 종료 및 성능 저하를 일으키지 않고 __try 블록을 즉시 종료할 수 있습니다. __leave 문이 지원되는지 확인하려면 컴파일러 설명서를 확인합니다.

__finally 블록 실행이 return 제어 문으로 인해 종료되는 경우 바깥쪽 함수의 닫는 중괄호에 대한 goto와 같습니다. 따라서 바깥쪽 함수가 반환됩니다.