다음을 통해 공유


try-finally

try-finally 문은 C 및 C++ 언어의 구조화된 예외 처리를 지원하는 Microsoft 전용 확장입니다.

구문

다음 구문에서는 try-finally 문을 설명합니다.

    // . . .
    __try {
        // guarded code
    }
    __finally {
        // termination code
    }
    // . . .

문법

try-finally-statement:
__try compound-statement __finally compound-statement

try-finally 문은 C 및 C++ 언어의 Microsoft 확장으로서, 코드 블록 실행이 중단된 경우 대상 애플리케이션이 정리 코드를 실행하게 해줍니다. 정리는 메모리 할당 해제, 파일 닫기 및 파일 핸들 해제와 같은 작업으로 구성됩니다. try-finally 문은 루틴으로부터 중간에 반환되게 만들 수 있는 오류가 있는지 확인하기 위해 검사가 수행되는 위치가 많은 루틴에 특히 유용합니다.

관련 정보 및 코드 샘플은 try-except을 참조하세요. 구조화된 예외 처리에 대한 자세한 내용은 구조화된 예외 처리를 참조하세요. C++/CLI를 사용하여 관리되는 애플리케이션의 예외 처리에 대한 자세한 내용은 /clr의 예외 처리를 참조하세요.

참고 항목

구조적 예외 처리는 Win32에서 C 및 C++ 소스 파일에 대해 작동하지만 특별히 C++용으로 설계되지는 않았습니다. C++ 예외 처리를 사용하여 코드의 이식성이 향상되는지 확인할 수 있습니다. 또한 C++ 예외 처리는 모든 형식의 예외를 처리할 수 있다는 점에서 보다 유연합니다. C++ 프로그램의 경우 C++ 예외 처리 메커니즘(try, catchthrow 문)을 사용하는 것이 좋습니다.

__try 절 뒤의 복합 문은 보호된 섹션입니다. __finally 절 뒤의 복합 문은 종료 처리기입니다. 처리기는 보호된 섹션이 종료될 때 예외(비정상 종료)로 보호된 섹션을 종료하는지 또는 표준 폴스루(정상 종료)에 의해 종료하는지 여부에 따라 실행되는 작업 집합을 지정합니다.

제어는 단순한 순차적 실행(제어 이동)에 의해 __try 문에 도달합니다. 제어가 __try에 들어가면 연결된 처리기가 활성화됩니다. 제어 흐름이 try 블록 끝에 도달하면 다음과 같이 실행됩니다.

  1. 종료 처리기가 호출됩니다.

  2. 종료 처리기가 완료되면 실행이 __finally 문 후에 계속됩니다. 그러나 보호된 섹션이 종료되면(예: 보호된 본문 외부의 goto 또는 return 문을 통해) 제어 흐름이 보호된 섹션 밖으로 이동하기 에 종료 처리기가 실행됩니다.

    __finally 문은 적절한 예외 처리기 검색을 차단하지 않습니다.

__try 블록에 예외가 발생할 경우 운영 체제에서 적합한 예외 처리기를 찾아야 합니다. 그렇지 않으면 프로그램이 실패합니다. 처리기를 찾으면 모든 __finally 블록이 실행되고 처리기에서 실행이 다시 시작됩니다.

예를 들어, 일련의 함수 호출 링크에서는 함수 A를 D에 연결한다고 가정합니다(아래 그림 참조). 각 함수에는 종료 처리기가 하나씩 있습니다. 예외가 D 함수에서 발생하고 A에서 처리될 경우 시스템이 스택 D, C, B를 해제하면 그 순서대로 종료 처리기가 호출됩니다.

종료 처리기 실행 순서의 다이어그램.

다이어그램은 함수 B를 호출하고, 함수 C를 호출하고, 함수 D를 호출하는 함수 A로 시작합니다. 함수 D는 예외를 발생합니다. 그런 다음 종료 처리기는 D의 종료 처리기, C, B, A의 순서로 호출되어 예외를 처리합니다.

종료 처리기 실행 순서

참고 항목

try-finally의 동작은 C#과 같이 finally 사용을 지원하는 일부 다른 언어와 다릅니다. 단일 __try에는 __finally__except 중 하나만 있을 수 있습니다. 모두 함께 사용되는 경우 외부 try-except 문은 내부 try-finally 문을 포함해야 합니다. 또한 각 블록을 실행할 때 지정되는 규칙은 서로 다릅니다.

이전 버전과의 호환성을 위해 _try, _finally_leave__try, __finally__leave의 동의어입니다. 단 컴파일러 옵션 /Za(언어 확장 사용 안 함)가 지정된 경우는 예외입니다.

__leave 키워드

__leave 키워드는 try-finally 문의 보호된 섹션 내에서만 유효하며, 보호된 섹션의 끝으로 이동하도록 합니다. 종료 처리기의 첫 번째 문에서 계속 실행됩니다.

goto 문은 보호된 섹션에서 외부로 이동할 수도 있지만 스택 해제를 호출하기 때문에 성능이 저하됩니다. __leave 문은 스택 해제를 발생시키지 않기 때문에 더 효율적입니다.

비정상적인 종료

longjmp 런타임 함수를 사용하여 try-finally 문을 종료하는 것은 비정상 종료로 간주됩니다. __try 문 안으로 이동할 수 없지만 이 문 밖으로 이동할 수는 있습니다. 출발 지점(__try 블록의 정상 종료)과 도착 지점(예외를 처리하는 __except 블록) 간에 활성화된 모든 __finally 문을 실행되어야 합니다. 이를 로컬 해제라고 합니다.

블록 밖으로의 점프를 포함하여 어떤 이유로든 __try 블록이 조기 종료되는 경우 시스템은 스택 해제 프로세스의 일부로 연결된 __finally 블록을 실행합니다. 이러한 경우 __finally 블록 내에서 호출되면 AbnormalTermination 함수는 true를 반환합니다. 그렇지 않으면 false를 반환합니다.

try-finally 문을 실행하는 중에 프로세스가 종료되면 종료 처리기가 호출되지 않습니다.

END Microsoft 전용

참고 항목

종료 처리기 작성
Structured Exception Handling (C/C++)
키워드
종료 처리기 구문