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 문은 대상 애플리케이션이 코드 블록 실행이 중단된 경우 클린up 코드 실행을 보장할 수 있도록 하는 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를 해제하면 그 순서대로 종료 처리기가 호출됩니다.

Diagram of the order of termination handler execution.

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

종료 처리기 실행 순서

참고 항목

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

이전 버전 _try_finally_leave 과의 호환성을 위해 컴파일러 옵션 /Za (언어 확장 사용 안 함)을 지정하지 않는 한 , __finally__leave < a0/>의 동의어__try입니다.

__leave 키워드

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

goto 문이 보호된 섹션에서 벗어날 수도 있지만 스택 해제를 호출하므로 성능이 저하됩니다. 이 __leave 문은 스택 해제를 일으키지 않으므로 더 효율적입니다.

비정상적인 종료

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

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

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

END Microsoft 전용

참고 항목

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