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 절은 예외 처리기가 있습니다.처리기 본문에는 보호 된 섹션을 실행 하는 동안 예외가 발생 하는 경우 수행할 작업 집합을 지정 합니다.실행은 다음과 같이 진행 됩니다.

  1. 보호 된 섹션을 실행 합니다.

  2. 보호 된 섹션을 실행 하는 동안 예외가 발생 하면 실행을 계속 문 뒤에 __except 절.

  3. 보호 된 섹션을 실행 하는 동안 예외가 발생 하거나 모든 루틴에서 요청 하면 보호 된 섹션의 __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 문을 보호 구역 크거나 복잡 한 경우 프로그래밍 실수를 가능성이 있기 때문입니다.

s58ftw19.collapse_all(ko-kr,VS.110).gif구조적된 예외 처리 내장 함수

구조적된 예외 처리를 사용 하는 데 사용할 수 있는 두 개의 내장 기능을 제공는 시도 하십시오-를 제외 하 고 문: GetExceptionCodeGetExceptionInformation.

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 특정 끝

참고 항목

참조

예외 처리기를 작성합니다.

구조적된 예외 처리 (C++)

C + + 키워드