Microsoft 전용
이 try-except 문은 일반적으로 실행을 종료하는 이벤트가 발생할 때 애플리케이션이 프로그램을 제어할 수 있도록 하는 C 언어에 대한 Microsoft 확장입니다. 이러한 이벤트를 예외라고 하며 예외를 처리하는 메커니즘을 구조적 예외 처리라고 합니다.
예외는 하드웨어 또는 소프트웨어 기반일 수 있습니다. 애플리케이션이 하드웨어 또는 소프트웨어 예외에서 완전히 복구할 수 없는 경우에도 구조적 예외 처리를 통해 오류 정보를 기록하고 표시할 수 있습니다. 애플리케이션의 내부 상태를 트래핑하여 문제를 진단하는 데 유용합니다. 특히 재현하기 쉽지 않은 일시적인 문제에 유용합니다.
문법
try-except-statement:
__trycompound-statement__except (expression)compound-statement
절 뒤의 __try 복합 문은 보호된 섹션입니다. 절 뒤의 __except 복합 문은 예외 처리기입니다. 처리기는 보호된 섹션을 실행하는 동안 예외가 발생하는 경우 수행할 작업 집합을 지정합니다. 실행은 다음과 같이 진행됩니다.
보호된 섹션이 실행됩니다.
보호된 섹션을 실행하는 동안 예외가 발생하지 않으면 절 뒤의 문에서 실행이
__except계속됩니다.보호된 섹션을 실행하는 동안 또는 보호된 섹션이 호출하는 루틴에서 예외가 발생하면 식이
__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 유효합니다. 그 효과는 __leave 블록의 끝으로 이동하는 것입니다 try-except . 예외 처리기가 종료된 후 실행이 다시 시작됩니다. 문은 goto 동일한 결과를 수행하는 데 사용할 수 있지만 문은 goto 스택 해제를 발생합니다. 이 문은 __leave 스택 해제를 포함하지 않으므로 더 효율적입니다.
런타임 함수를 try-except 사용하여 longjmp 문을 종료하는 것은 비정상적인 종료로 간주됩니다. 성명서에 __try 뛰어 들지 않는 것은 합법적이지 않지만, 한 명에서 뛰어내는 것은 합법적입니다. 문을 실행하는 try-except 동안 프로세스가 종료되는 경우 예외 처리기가 호출되지 않습니다.
예시
다음은 예외 처리기 및 종료 처리기의 예입니다. 종료 처리기에 대한 자세한 내용은 문(C)을 참조try-finally하세요.
.
.
.
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 관련