try-except 문 (C)try-except Statement (C)

Microsoft 전용Microsoft Specific

try-except 문은 정상적으로 실행을 종료시키는 이벤트가 발생하는 경우 응용 프로그램이 프로그램의 제어를 얻을 수 있도록 하는 C 언어에 대한 Microsoft 확장입니다.The try-except statement is a Microsoft extension to the C language that enables applications to gain control of a program when events that normally terminate execution occur. 이러한 이벤트를 예외라고 하고 예외를 처리하는 메커니즘은 구조적 예외 처리라고 합니다.Such events are called exceptions, and the mechanism that deals with exceptions is called structured exception handling.

예외는 하드웨어 또는 소프트웨어 기반일 수 있습니다.Exceptions can be either hardware- or software-based. 응용 프로그램을 하드웨어 또는 소프트웨어 예외로부터 완전히 복구할 수 없더라도 구조적 예외 처리를 통해 오류 정보를 표시하고 응용 프로그램의 내부 상태를 트래핑하여 문제를 진단하는 데 도움이 되도록 합니다.Even when applications cannot completely recover from hardware or software exceptions, structured exception handling makes it possible to display error information and trap the internal state of the application to help diagnose the problem. 이것은 쉽게 재현할 수 없는 간헐적인 문제에 특히 유용합니다.This is especially useful for intermittent problems that cannot be reproduced easily.

구문Syntax

try-except-statement:try-except-statement:
__try compound-statement__try compound-statement

__except ( expression ) compound-statement__except ( expression ) compound-statement

__try 절 뒤의 복합 문은 보호된 섹션입니다.The compound statement after the __try clause is the guarded section. __except 절 뒤에 오는 복합 문은 예외 처리기입니다.The compound statement after the __except clause is the exception handler. 처리기는 보호된 섹션을 실행하는 동안 예외가 발생하는 경우 수행할 일련의 작업을 지정합니다.The handler specifies a set of actions to be taken if an exception is raised during execution of the guarded section. 다음과 같이 실행됩니다.Execution proceeds as follows:

  1. 보호된 섹션이 실행됩니다.The guarded section is executed.

  2. 보호된 섹션을 실행하는 동안 예외가 발생하지 않는 경우 __except 절 다음의 문에서 실행이 계속됩니다.If no exception occurs during execution of the guarded section, execution continues at the statement after the __except clause.

  3. 보호된 섹션의 실행 중이나 보호된 섹션에서 호출하는 루틴에서 예외가 발생하는 경우 __except 식이 계산되고 반환된 값에 따라 예외 처리 방식이 결정됩니다.If an exception occurs during execution of the guarded section or in any routine the guarded section calls, the __except expression is evaluated and the value returned determines how the exception is handled. 다음과 같은 세 가지 값이 있습니다.There are three values:

    EXCEPTION_CONTINUE_SEARCH 예외가 인식되지 않습니다.EXCEPTION_CONTINUE_SEARCH Exception is not recognized. try-except 문을 포함하는 처리기를 먼저 검색한 후, 그 다음으로 우선 순위가 높은 처리기를 검색하는 순으로 처리기 스택을 계속 검색합니다.Continue to search up the stack for a handler, first for containing try-except statements, then for handlers with the next highest precedence.

    EXCEPTION_CONTINUE_EXECUTION 예외가 인식되지만 무시됩니다.EXCEPTION_CONTINUE_EXECUTION Exception is recognized but dismissed. 예외가 발생한 지점에서 계속 실행합니다.Continue execution at the point where the exception occurred.

    EXCEPTION_EXECUTE_HANDLER 예외가 인식됩니다.EXCEPTION_EXECUTE_HANDLER Exception is recognized. __except 복합 문을 실행하여 예외 처리기로 제어를 전달한 다음 실행이 발생한 지점에서 실행을 계속합니다.Transfer control to the exception handler by executing the __except compound statement, then continue execution at the point the exception occurred.

    __except 식은 C 식으로 계산되므로 단일 값, 조건식 연산자 또는 쉼표 연산자로 제한됩니다.Because the __except expression is evaluated as a C expression, it is limited to a single value, the conditional-expression operator, or the comma operator. 더 광범위한 처리가 필요한 경우 식은 위에 나열된 세 값 중 하나를 반환하는 루틴을 호출할 수 있습니다.If more extensive processing is required, the expression can call a routine that returns one of the three values listed above.

참고

구조적 예외 처리는 C 및 C++ 소스 파일에서 작동합니다.Structured exception handling works with C and C++ source files. 특별히 C++용으로 설계되지는 않았습니다.However, it is not specifically designed for C++. C++ 예외 처리를 사용하여 코드의 이식성이 향상되는지 확인할 수 있습니다.You can ensure that your code is more portable by using C++ exception handling. 또한 C++ 예외 처리 메커니즘은 모든 형식의 예외를 처리할 수 있다는 점에서 훨씬 유연합니다.Also, the C++ exception handling mechanism is much more flexible, in that it can handle exceptions of any type.

참고

C++ 프로그램의 경우 구조적 예외 처리 대신 C++ 예외 처리를 사용해야 합니다.For C++ programs, C++ exception handling should be used instead of structured exception handling. 자세한 내용은 C++ 언어 참조예외 처리를 참조하세요.For more information, see Exception Handling in the C++ Language Reference.

응용 프로그램의 각 루틴에는 자체 예외 처리기가 있을 수 있습니다.Each routine in an application can have its own exception handler. __except 식은 __try 본문의 범위에서 실행됩니다.The __except expression executes in the scope of the __try body. 즉, 이 범위에서 선언된 모든 지역 변수에 액세스할 수 있습니다.This means it has access to any local variables declared there.

__leave 키워드는 try-except 문 블록 내에서 유효합니다.The __leave keyword is valid within a try-except statement block. __leave의 효과는 try-except 블록의 끝으로 이동하는 것입니다.The effect of __leave is to jump to the end of the try-except block. 예외 처리기의 끝 다음에 실행이 다시 시작됩니다.Execution resumes after the end of the exception handler. goto 문을 사용하여 동일한 결과를 얻을 수 있지만 goto 문은 스택 해제를 초래합니다.Although a goto statement can be used to accomplish the same result, a goto statement causes stack unwinding. __leave 문은 스택 해제를 초래하지 않으므로 더 효율적입니다.The __leave statement is more efficient because it does not involve stack unwinding.

longjmp 런타임 함수를 사용하여 try-except 문을 종료하는 것은 비정상 종료로 간주됩니다.Exiting a try-except statement using the longjmp run-time function is considered abnormal termination. __try 문 안으로 이동할 수 없지만 이 문 밖으로 이동할 수는 있습니다.It is illegal to jump into a __try statement, but legal to jump out of one. try-except 문을 실행하는 도중에 프로세스가 강제로 종료되는 경우 예외 처리기가 호출되지 않습니다.The exception handler is not called if a process is killed in the middle of executing a try-except statement.

예제Example

다음은 예외 처리기와 종료 처리기의 예제입니다.Following is an example of an exception handler and a termination handler. 종료 처리기에 대한 자세한 내용은 try-finally 문을 참조하세요.See The try-finally Statement for more information about termination handlers.

.  
.  
.  
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");  

다음은 예제에서 출력된 결과이며 오른쪽에 주석이 추가되어 있습니다.This is the output from the example, with commentary added on the right:

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                  */  

Microsoft 전용 종료END Microsoft Specific

참고 항목See Also

try-except 문try-except Statement