try-제외한 문
Microsoft 전용
Try 다음 구문을 설명-문을 제외 하 고:
__try
{
// guarded code
}
__except ( expression )
{
// exception handler code
}
설명
시도-제외 하 고 문인 C Microsoft 확장 및 프로그램이 실행을 정상적으로 종료 되는 이벤트가 발생 하는 경우 대상 응용 프로그램에 사용 되는 C++ 언어를 제어 합니다.이러한 이벤트가 예외 라고 하 고 구조적된 예외 처리 예외 처리 메커니즘 호출 됩니다.
관련된 정보에 대 한 참조를 try-finally 문.
하드웨어 기반 또는 소프트웨어 기반 수 있습니다.구조적된 예외 처리 응용 프로그램에서 하드웨어 또는 소프트웨어 예외 완전히 복구할 수 없는 경우에 때 오류 정보를 표시 하 고 문제를 진단 하는 데 도움이 되는 응용 프로그램의 내부 상태를 잡을 수 있습니다.쉽게 재현할 수 없는 간헐적인 문제에 특히 유용 합니다.
[!참고]
구조적된 예외를 C와 C++ 소스 파일에 대 한 w i n 32 사용을 처리 합니다.그러나이 특히 C++에 대 한 설계 되지 않았습니다.C + + 예외 처리를 사용 하 여 코드를 이식 수를 확인할 수 있습니다.또한 모든 형식의 예외를 처리할 수 있다는 점에서 C++ 예외 처리 보다 유연한입니다.C + + 프로그램에서 C++ 예외 처리 메커니즘을 사용 하는 것이 좋습니다 (try, catch 및 throw 문).
복합 문이 뒤에 __try 절 된 본문 또는 보호 구역.복합 문이 뒤에 __except 절은 예외 처리기가 있습니다.처리기 본문에는 보호 된 섹션을 실행 하는 동안 예외가 발생 하는 경우 수행할 작업 집합을 지정 합니다.실행은 다음과 같이 진행 됩니다.
보호 된 섹션을 실행 합니다.
보호 된 섹션을 실행 하는 동안 예외가 발생 하면 실행을 계속 문 뒤에 __except 절.
보호 된 섹션을 실행 하는 동안 예외가 발생 하거나 모든 루틴에서 요청 하면 보호 된 섹션의 __except식 (라고는 필터 식) 평가 하는 값의 예외를 처리 하는 방법을 결정 하 고. 값이 세 개 있습니다.
(-1) 발생할 수 있습니다 는 예외 해제 합니다.예외가 발생 한 지점에서 계속 실행 됩니다.
EXCEPTION_CONTINUE_SEARCH (0) 예외를 인식할 수 없습니다.위로 처리기에 대 한 처음에 있는 검색을 계속 시도 하십시오-를 제외 하 고 다음 우선 순위가 높은 처리기에 대 한 다음 문을.
EXCEPTION_EXECUTE_HANDLER (1) 예외를 인식 합니다.실행 하 여 예외 처리기로 제어를 전달의 __except 복합 명령문에서 다음 이후에 실행이 계속의 __except 블록입니다.
때문에 _ _를 제외 하 고 C 식으로 식을 계산할 단일 값, 조건식 연산자 또는 쉼표 연산자 제한 됩니다.더욱 다양 한 처리가 필요한 경우 식을 위에 나열 된 세 개의 값 중 하나를 반환 하는 루틴을 호출할 수 있습니다.
각 응용 프로그램 자체 예외 처리기를 있습니다.
이를 잘못 된 것은 __try 문을 잘못 중 하나를 이동할 수 있지만.프로세스 실행 중간에 종료 되는 경우 예외 처리기가 호출 되는 시도-제외 하 고 문.
자세한 내용은 기술 자료 문서 q315937를 참조 하십시오: HOW TO: Visual C++ 응용 프로그램에서 스택 오버플로 트랩.
__Leave 키워드
__leave 키워드의 보호 구역 내 에서만 사용할 수 있는 try-except 문과 그 효과 보호 된 섹션의 끝으로 이동 합니다.예외 처리기의 첫 번째 문으로 계속 실행이 됩니다.
A goto 문을 부족의 보호 구역에서 점프할 수 수도 처럼 성능이 저하 되지 않습니다을 try-finally 문을 스택 해제가 발생 하지 않습니다 때문에.그러나 사용 하는 것이 좋습니다는 __leave 키워드 보다는 goto 문을 보호 구역 크거나 복잡 한 경우 프로그래밍 실수를 가능성이 있기 때문입니다.
구조적된 예외 처리 내장 함수
구조적된 예외 처리를 사용 하는 데 사용할 수 있는 두 개의 내장 기능을 제공는 시도 하십시오-를 제외 하 고 문: GetExceptionCode 및 GetExceptionInformation.
GetExceptionCode 예외는 코드 (32 비트 정수)를 반환 합니다.
내장 함수 GetExceptionInformation 예외에 대 한 추가 정보를 포함 하는 구조체에 대 한 포인터를 반환 합니다.이 포인터를 통해 하드웨어 예외 때의 컴퓨터 상태를 액세스할 수 있습니다.구조는 다음과 같습니다.
struct _EXCEPTION_POINTERS {
EXCEPTION_RECORD *ExceptionRecord,
CONTEXT *ContextRecord }
포인터 형식 _EXCEPTION_RECORD 및 _컨텍스트 EXCPT 포함 파일에 정의 됩니다.H.
사용할 수 있는 GetExceptionCode 예외 처리기 내에서 합니다.그러나 사용할 수 있는 GetExceptionInformation 내 예외 필터 식입니다.가 가리키는 내용은 일반적으로 스택에 이며 예외 처리기로 제어가 전달 되 면 더 이상 사용할 수 없습니다.
내장 함수 AbnormalTermination 종료 처리기 내에서 사용할 수 있습니다.경우 0을 반환의 본문은 try-finally 문은 종료 순서 대로.다른 모든 경우에는 1을 반환합니다.
EXCPT입니다.H 이러한 내장 일부 대체 이름을 정의합니다.
GetExceptionCode _exception_code 하는 것과 같습니다
GetExceptionInformation _exception_info 하는 것과 같습니다
AbnormalTermination _abnormal_termination 하는 것과 같습니다
예제
// exceptions_try_except_Statement.cpp
// Example of try-except and try-finally statements
#include <stdio.h>
#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION
#include <excpt.h>
int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {
puts("in filter.");
if (code == EXCEPTION_ACCESS_VIOLATION) {
puts("caught AV as expected.");
return EXCEPTION_EXECUTE_HANDLER;
}
else {
puts("didn't catch AV, unexpected.");
return EXCEPTION_CONTINUE_SEARCH;
};
}
int main()
{
int* p = 0x00000000; // pointer to NULL
puts("hello");
__try{
puts("in try");
__try{
puts("in try");
*p = 13; // causes an access violation exception;
}__finally{
puts("in finally. termination: ");
puts(AbnormalTermination() ? " \tabnormal" : "\tnormal");
}
}__except(filter(GetExceptionCode(), GetExceptionInformation())){
puts("in except");
}
puts("world");
}
Output
hello
in try
in try
in filter.
caught AV as expected.
in finally. termination:
abnormal
in except
world
Microsoft 특정 끝