다음을 통해 공유


try-except 문 (C)

Microsoft 전용

try-except 문은 정상적으로 실행을 종료시키는 이벤트가 발생하는 경우 애플리케이션이 프로그램의 제어를 얻을 수 있도록 하는 C 언어에 대한 Microsoft 확장입니다. 이러한 이벤트를 예외라고 하고 예외를 처리하는 메커니즘은 구조적 예외 처리라고 합니다.

예외는 하드웨어 또는 소프트웨어 기반일 수 있습니다. 애플리케이션을 하드웨어 또는 소프트웨어 예외로부터 완전히 복구할 수 없더라도 구조적 예외 처리를 통해 오류 정보를 기록 및 표시할 수 있도록 합니다. 애플리케이션의 내부 상태를 트랩하여 문제를 진단하는 데 도움이 됩니다. 특히 재현하기 어려운 일시적인 문제에 유용합니다.

구문

:
__try compound-statement __except ( expression ) compound-statement

__try 절 뒤에 오는 복합 문은 보호된 섹션입니다. __except 절 뒤에 오는 복합 문은 예외 처리기입니다. 처리기는 보호된 섹션을 실행하는 동안 예외가 발생하는 경우 수행할 일련의 작업을 지정합니다. 다음과 같이 실행됩니다.

  1. 보호된 섹션이 실행됩니다.

  2. 보호된 섹션을 실행하는 동안 예외가 발생하지 않는 경우 __except 절 다음의 문에서 실행이 계속됩니다.

  3. 보호된 섹션이 실행 중일 때나 보호된 섹션에서 호출하는 루틴에서 예외가 발생하는 경우 __except 식이 평가됩니다. 반환된 값에 따라 예외 처리 방법이 결정됩니다. 세 가지 값을 사용할 수 있습니다.

    • EXCEPTION_CONTINUE_SEARCH: 예외가 인식되지 않습니다. try-except 문을 포함하는 처리기를 먼저 검색한 후, 그 다음으로 우선 순위가 높은 처리기를 검색하는 순으로 처리기 스택을 계속 검색합니다.

    • EXCEPTION_CONTINUE_EXECUTION: 예외가 인식되지만 무시됩니다. 예외가 발생한 지점에서 계속 실행합니다.

    • EXCEPTION_EXECUTE_HANDLER: 예외가 인식됩니다. __except 복합 문을 실행하여 예외 처리기로 제어를 전달한 다음 실행이 발생한 지점에서 실행을 계속합니다.

__except 식은 C 식으로 계산되므로 단일 값, 조건식 연산자 또는 쉼표 연산자로 제한됩니다. 더 광범위한 처리가 필요한 경우 식은 위에 나열된 세 값 중 하나를 반환하는 루틴을 호출할 수 있습니다.

참고

구조적 예외 처리는 C 및 C++ 소스 파일에서 작동합니다. 특별히 C++용으로 설계되지는 않았습니다. 이식 가능한 C++ 프로그램의 경우 구조적 예외 처리 대신 C++ 예외 처리를 사용해야 합니다. 또한 C++ 예외 처리 메커니즘은 모든 형식의 예외를 처리할 수 있다는 점에서 훨씬 유연합니다. 자세한 내용은 C++ 언어 참조의 예외 처리를 참조하세요.

애플리케이션의 각 루틴에는 자체 예외 처리기가 있을 수 있습니다. __except 식은 __try 본문의 범위에서 실행됩니다. 이 범위에서 선언된 모든 지역 변수에 액세스할 수 있습니다.

__leave 키워드는 try-except 문 블록 내에서 유효합니다. __leavetry-except 블록의 끝으로 이동하는 효과가 있습니다. 예외 처리기의 끝 다음에 실행이 다시 시작됩니다. goto 문을 사용하여 동일한 결과를 얻을 수 있지만 goto 문은 스택 해제를 초래합니다. __leave 문은 스택 해제를 초래하지 않으므로 더 효율적입니다.

longjmp 런타임 함수를 사용하여 try-except 문을 종료하는 것은 비정상 종료로 간주됩니다. __try 문 안으로 이동할 수 없지만 이 문 밖으로 이동할 수는 있습니다. try-except 문을 실행하는 도중에 프로세스가 강제로 종료되는 경우 예외 처리기가 호출되지 않습니다.

다음은 예외 처리기와 종료 처리기의 예제입니다. 종료 처리기에 대한 자세한 내용은 try-finally 문(C)을 참조하세요.

.
.
.
puts("hello");
__try {
   puts("in try");
   __try {
      puts("in try");
      RAISE_AN_EXCEPTION();
   } __finally {
      puts("in finally");
   }
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
   puts("in except");
}
puts("world");

다음은 예제에서 출력된 결과이며 오른쪽에 주석이 추가되어 있습니다.

hello
in try              /* fall into try                        */
in try              /* fall into nested try                 */
in filter           /* execute filter; returns 1 so accept  */
in finally          /* unwind nested finally                */
in except           /* transfer control to selected handler */
world               /* flow out of handler                  */

END Microsoft 전용

추가 정보

try-except 문(C++)