try-제외한 문 (C)
Microsoft 전용
시도 하십시오-를 제외 하 고 Microsoft 응용 프로그램이 실행을 정상적으로 종료 되는 이벤트가 발생할 때 프로그램의 제어를 획득할 수 있게 하는 C 언어 확장입니다.이러한 이벤트가 예외 라고 하 고 구조적된 예외 처리 예외 처리 메커니즘 호출 됩니다.
어떤 하드웨어 기반 또는 소프트웨어 기반 수 있습니다.구조적된 예외 처리 응용 프로그램에서 하드웨어 또는 소프트웨어 예외 완전히 복구할 수 없는 경우에 때 오류 정보를 표시 하 고 문제를 진단 하는 데 도움이 되는 응용 프로그램의 내부 상태를 잡을 수 있습니다.쉽게 재현할 수 없는 간헐적인 문제에 특히 유용 합니다.
구문
문을 제외한 try:
__try 복합 문__except ( 식 ) 복합 문
복합 문이 뒤에 __try 절 보호 구역입니다.복합 문이 뒤에 __except 절은 예외 처리기가 있습니다.처리기는 보호 된 섹션을 실행 하는 동안 예외가 발생 하는 경우 수행할 작업을 지정 합니다.실행은 다음과 같이 진행 됩니다.
보호 된 섹션을 실행 합니다.
보호 된 섹션을 실행 하는 동안 예외가 발생 하면 실행을 계속 문 뒤에 __except 절.
보호 된 섹션을 실행 하는 동안 예외가 발생 하거나 모든 루틴에서 요청 하면 보호 된 섹션의__except 입니다 식이 계산 하 고 반환 값을 사용 하 여 예외를 처리 하는 방법을 결정 합니다.값이 세 개 있습니다.
EXCEPTION_CONTINUE_SEARCH예외를 인식할 수 없습니다.위로 처리기에 대 한 처음에 있는 검색을 계속 시도 하십시오-를 제외 하 고 다음 우선 순위가 높은 처리기에 대 한 다음 문을.
EXCEPTION_CONTINUE_EXECUTION예외를 인식 하지만 해제 합니다.예외가 발생 한 지점에서 계속 실행 됩니다.
EXCEPTION_EXECUTE_HANDLER예외를 인식할 수 있습니다.실행 하 여 예외 처리기로 제어를 전달의 __except 복합 명령문에서 다음 예외가 발생 한 지점에서 실행이 계속 됩니다.
때문에 있는 __except C 식으로 식을 계산할 단일 값, 조건식 연산자 또는 쉼표 연산자 제한 됩니다.더욱 다양 한 처리가 필요한 경우 식을 위에 나열 된 세 개의 값 중 하나를 반환 하는 루틴을 호출할 수 있습니다.
[!참고]
구조적된 예외 처리는 C 및 C++ 소스 파일에서 작동합니다.그러나이 특히 C++에 대 한 설계 되지 않았습니다.C + + 예외 처리를 사용 하 여 코드를 이식 수를 확인할 수 있습니다.모든 형식의 예외를 처리할 수 있다는 점에서 C++ 예외 처리 메커니즘 훨씬 유연한 이기도 합니다.
[!참고]
C + + 프로그램에서 C++ 예외 처리 대신 구조적된 예외 처리 사용 해야 합니다.자세한 내용은 예외 처리 에 C++ 언어 참조.
응용 프로그램에서 각 루틴 자체 예외 처리기를 사용할 수 있습니다.__except 식의 범위에서 실행 되는 __try 본문입니다.따라서 지역 변수는 선언 된 액세스 했습니다.
__leave 키워드를 사용할 수 있는 시도-제외 하 고 문 블록입니다.효과를 __leave 의 끝으로 이동 하는 것은 시도 하십시오-를 제외 하 고 블록.예외 처리기의 끝 후 실행을 다시 시작 합니다.하지만 goto 문을 사용 하 여 동일한 결과 얻을 수 있는 goto 문 스택 해제.__leave 스택 해제가 포함 되지 않은 때문에 문에 더 효율적입니다.
종료는 시도-제외 하 고 문을 사용 하는 longjmp 함수 실행 시간 비정상적인 종료 것으로 간주 합니다.로 이동할 수 없습니다는 __try 문, 하지만 법 중 하나를 이동할 수 있습니다.프로세스가 실행 중간에 종료 될 경우 예외 처리기가 호출 되는 시도-를 제외 하 고 문.
예제
다음 예는 예외 처리기 및 종료 처리기입니다.참조 하십시오 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 */
Microsoft 특정 끝