EXCEPTEX 트랩 MFC, Win32 예외 구성

기술 자료 번역 기술 자료 번역
기술 자료: 167802 - 이 문서가 적용되는 제품 보기.
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
모두 확대 | 모두 축소

이 페이지에서

요약

EXCEPTEX는 Win32 구조적 예외 및 C++ 예외 트래핑 기술을 보여 주는 샘플입니다. C++ 예외 클래스를 사용하는 예외, 열기 더 일반적으로 해독하는 방법을 보여 주는 다양한 도우미 함수가 제공됩니다. Win32 구조적 예외 throw 된 Win32 예외의 형식을 식별하는 도우미 함수가 제공됩니다.

다음 파일은 Microsoft 다운로드 센터에서 사용할 수 있습니다.


Exceptex.exe

Microsoft 지원 파일을 다운로드하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
119591온라인 서비스로부터 Microsoft 지원 파일 구하는 방법
Microsoft는 이 파일에 대한 바이러스를 검색합니다. Microsoft는 파일을 게시한 날짜에 사용할 수 있었던 최신 바이러스 검색 소프트웨어가 사용됩니다. 해당 파일을 무단으로 변경할 수 없는 보안이 향상된 서버에 보관됩니다.

추가 정보

Win32 및 C++ 예외 처리 병합

C++ 예외 처리 및 Win32 구조적 예외 처리 예외를 잡아내는 다른 구문을 사용합니다.
    // C++ Exception Handler
    try
    {
        // Do something that may raise an exception
    }
    catch( <class name> <instance of class> )
    {
        // handle exception
    }

    // Win32 Structured Exception Handler
    __try
    {
        // Do something that may raise an exception
    }
    __except( expression )
    {
        // handle exception
    }
				
있는 기본 Win32 구조적 예외 처리 세 생성합니다 서명되지 않은 경우에만 catch한 반면 C++ 예외 처리, 형식의 인스턴스 catch 것으로 기대하는 있다는 것을 차이.

그러나 C++ 및 Win32 예외 처리 통해 _set_se_translator() 함수에 병합할 수. 이로 인해 Win32 예외 정보가 있는 클래스, 줄 바꿈 및 "로 C++ throw" 사용자가 선택한 처리기 함수에 전달할 수 있도록 Win32 예외를 예외. 자동으로 Win32 예외 발생 및 C++ 예외 프로그램으로 매끄럽게 보입니다 이런 (VC 5.0 infoviewer 예외 처리 차이점 참조). 이 로그 매크로를 사용하면에 대해 자동으로 완료, 관련된 Log() 함수를 지원합니다.
    // Class for containing information on a Win32 Structured Exception
    class SEH_Exception {
    private:
        SEH_Exception() {}
        unsigned int m_uSECode;
    public:
        SEH_Exception(unsigned int uSECode) : m_uSECode(uSECode) {}
        ~SEH_Exception() {}
        unsigned int getSeHNumber() { return m_uSECode; }
    };

    // Handler function that passes on Win32 Exception information in the
    // C++ class SEH_Exception
    void MappingSEHtoCPPExceptions( unsigned int uExceptionCode,
                                                  _EXCEPTION_POINTERS* )
    {
        throw SEH_Exception( uExceptionCode );
    }

    // Initialize Exception Handling
    void LogEnable( ... )
    {
        // Set Win32 Exceptions to be handled as C++ typed exceptions
        _set_se_translator(MappingSEHtoCPPExceptions);

        ...
    }
				
이 경우 LogEnable 한 번, 초기에 프로그램의 실행이 호출됩니다 및 C++ 구문을 사용하여 모든 Win32 예외를 발생시킨 발견되었습니다 수 있습니다. 다음 샘플에서는 EXCEPTEX이 위의 코드를 사용하여 보여 줍니다.

C++ 예외 형식

여러 종류의 수행하는 동안 MFC 기반 프로그램에서 발견되었습니다 C++ 예외는 다음과 같습니다.

  • 클래스의 인스턴스를 MFC에서 파생된 CException
  • Win32 캡슐화하는 클래스 인스턴스를 예외
  • 인스턴스의 Visual C++ 5.0 발생하는 클래스 _com_error 네이티브 COM # import 지시문을 통해 사용 가능한 지원.
이러한 각에 대해 EXCEPTEX LogException, 특정 형식의 예외 catch해야 중인 오버로드된 함수를 제공합니다. 각각의 경우, 인스턴스 또는 포인터가 C++ 클래스는 일반적으로 특정 형식의 예외를 발생시킵니다. C++ 예외 위에 나열된 형식 각각에 대해 over-loaded 버전 LogException 있습니다.

아래 MFC CException 클래스에 대한 포인터를 찾아 냅니다 오버로드된 LogException 함수 선언의 예입니다.
    // Crack open and log details of different types of exceptions
    extern void LogException( CException    *e,
                              LPCSTR        lpszTimeStamp,
                              LPCSTR        lpszFile,
                              int           nLine        );
				
예외 매크로 호출 스택에 마지막으로 사용한 위치에 LogException 또한 파일 이름과 줄 번호를 추적합니다 (도우미 로그 사용된 경우 매크로).

이러한 도우미 각각 크랙이 열기 예외를 함수 및 필요에 따라 처리할 수 있는 문자열 배열을 결과를 저장합니다. LogDisplay() TRACE() 매크로 이 문자열 배열로 내용이 덤프되는 것 위한 함수입니다.

try/catch 단순화 도우미 매크로 차단

코드에서 try/catch 블록을 littering 잠시 후 복잡해져서 얻을 수 있습니다. 그러나 예외 블록을 통해 매크로 단순화할 수 있습니다. 이 프로세스를 단순화하기 위해 세 가지 매크로를 EXCEPTEX 제공하며 각 로깅/예외 처리를 위한 다양한 기능을 제공합니다. 매크로를 각각 수도 있으므로 사용 중인 컴파일러가 버전을 확인해야 합니다 4.X Visual C++ 및 Visual C++ 5.0 작동하도록 작성된 있습니다.

다음은 간단한 매크로 (자동 예외 처리 로깅이 함께) LOGQ 것입니다. bRetVal 라는 부울 변수를 코드에서 사용할 수 있는지 기대하고 있습니다. 매크로 예외를 발생시키는 코드의 실행을 수 있도록 true 수 있어야 하며 FALSE로 예외가 발생한 경우 설정합니다.
    #if _MSC_VER < 1100    // For version VC++ 4.2 or earlier

        #define LOGQ( f ) if( bRetVal == TRUE )                \ 
                          {                                    \ 
                             try                               \ 
                             {                                 \ 
                                 f;                            \ 
                             }                                 \ 
                             catch( CException *e )            \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                                 e->Delete();                  \ 
                             }                                 \ 
                             catch( SEH_Exception )            \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                             }                                 \ 
                             catch(...)                        \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                             }                                 \ 
                          }

    #else

        #define LOGQ( f ) if( bRetVal == TRUE )                \ 
                          {                                    \ 
                             try                               \ 
                             {                                 \ 
                                f;                             \ 
                             }                                 \ 
                             catch( CException *e )            \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                                e->Delete();                   \ 
                             }                                 \ 
                             catch( _com_error )               \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                              }                                \ 
                             catch( SEH_Exception )            \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                             }                                 \ 
                             catch(...)                        \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                             }                                 \ 
                          }

    #endif
				
# ifdef _MSC_VER Visual C++ 4.X 또는 5.0에서 구체적으로 매크로 정의의 제한합니다. # import에서 만든 코드를 생성한 새로 도입된 _com_error 예외 catch 5.0 버전이 포함되어 있습니다.

아래와 같이 LOGQ 사용합니다:
    int     i = 0;
    int     j;
    BOOL    bRetVal = TRUE;

    // This code is not safe
    j = 1 / i;        // Raises Win32 Divide By Zero exception

    // This code is safe
    LOGQ( j = 1 / i; )
				
수 있는 다른 두 버전의 EXCEPTEX에 의해 제공되는 로그 매크로. 두 번째 로그 매크로 위에서 설명한 오버로드된 LogException() 도우미를 사용합니다.
    #define LOGE( f ) try                               \ 
                      {                                 \ 
                          f;                            \ 
                      }                                 \ 
                      catch( CException *e )            \ 
                      {                                 \ 
                          LogException( e,              \ 
                                        __TIMESTAMP__,  \ 
                                        __FILE__,       \ 
                                        __LINE__      );\ 
                      }                                 \ 
                      ...
				
이 매크로를 만들 수는 없습니다 중 플래그를 bRetVal 사용합니다. 이가 됩니다 항상 매크로에서 캡슐화된 코드를 실행할 발생한 예외를 catch 및 그 내용을 기록합니다.

LOGQ 및 LOGE EXCEPTEX, LOGR, 제공된 마지막 로그 매크로가 결합합니다. 이를 이를 합니다 코드를 실행하고 발생하는 모든 예외 로그 경우 확인합니다.
    #define LOGR( f ) if( bRetVal == TRUE )                 \ 
                      {                                     \ 
                          try                               \ 
                          {                                 \ 
                              f;                            \ 
                          }                                 \ 
                          catch( CException *e )            \ 
                          {                                 \ 
                              LogException( e,              \ 
                                            __TIMESTAMP__,  \ 
                                            __FILE__,       \ 
                                            __LINE__      );\ 
                              bRetVal = FALSE;              \ 
                          }                                 \ 
                          ...
                        }
				

다른 유용한 기능

EXCEPTEX 예제 예외 처리를 돕기 위해 세 가지 이상의 함수를 제공합니다.
LogDisplay() TRACE 매크로는 통해 out 모든 기록된 예외 내용을 덤프합니다.

LogDisplay (...) 예외의 모든 기록된 out CListBox 인스턴스에 내용을 덤프합니다.

LogSaveToFile (...) 예외의 모든 기록된 out 파일 내용을 덤프합니다.

LOG.H 및 LOG.CPP

LOG.H 및 LOG.CPP EXCEPTEX 예외를 처리할 수 있는 모든 코드가 포함되어 있습니다. 이 샘플에서는 나머지 LOG.H 및 LOG.CPP 매크로를/함수를 보여 주는 것입니다. 이 두 파일을 기존 프로젝트를 쉽게 추가할 수 및 어느 Visual C++ 4.X 컴파일하려면 작성된 또는 ANSI 및 유니코드 5.0 빌드합니다. 이를 사용하려면 # 추가 "log.h" LOGE 또는 LOGR 매크로를 사용하여 파일을 포함합니다. 또한 Win32 구조적 예외 해독하는 경우 프로그램 시작 부분에서 LogEnable 한 번만 호출해야 합니다.
   // One time initialization of data
    LogEnable(false);     // false to verbose mode
				
예외 데이터를 가져오는 코드에서 로그 매크로를 추가합니다.
   ...
   LOGE(myFunction())
   ...
				
파일 및 줄 번호 보고된 참고 스택에 마지막 로그 매크로 됩니다. myFunction() myFun1() 및 myFun2() 호출하면 예외가 발생한 어떤 호출을 표시하려면 출력 로그 매크로 사용하여 각 함수 호출을 래핑하는 합니다.

항상 해당 로그 사용할 수 없는 매크로 또는 제공한 LogException() 도우미를 경우에도. 편의를 모두 제공되는 및 그대로 포괄적인 예외 처리를 보여 주기 위해 잘 및 모든 예외 결과를 로깅하는 발견되었습니다. 예외 처리 모든 프로덕션 환경에서 수 모든 end-all 파일로 제공되지 않습니다.

문제 해결

    LOGQ( int i = 0; )
    LOGQ( int j = 1 / i; )    // Will this raise a divide by zero?
				
i 첫 번째 LOGQ 매크로 범위에서 정의된 경우에만 것처럼 이 코드는 컴파일러 오류를 생성합니다. LOGQ로 확장하여 기억할:
>
    ...
    try
    {
        int i = 0;
    }
    ...

    ...
    try
    {
        int j = 1 / i;  // error C2065: 'i' : undeclared
    }
    ...
				

/W4 및 # import

Visual C++와 # import/W4 플래그를 사용하는 경우 # import 활용하는 포함 파일을 8 경고가 표시됩니다.
comutil.h(905): 경고 C4310: 캐스팅할 때 상수 값은 잘립니다.
comutil.h(928): 경고 C4310: 캐스팅할 때 상수 값은 잘립니다.
comutil.h(1030): 경고 C4310: 캐스팅할 때 상수 값은 잘립니다.
comutil.h(1281): 경고 C4310: 캐스팅할 때 상수 값은 잘립니다.
comutil.h(1307): 경고 C4310: 캐스팅할 때 상수 값은 잘립니다.
comutil.h(1476): 경고 C4310: 캐스팅할 때 상수 값은 잘립니다.
comdef.h(242): C4244 경고: 'Return': 'int' 데이터 손실 '서명되지 짧은', 가능한 변환
이러한 오류 메시지는 무시될 수 있으며 코드에 영향을 주지 않습니다.

추가 정보

다음 VC ++ 5.0 infoviewer 항목을 좋은 소개를 예외 처리 기법을 제공합니다.
예외 처리: 질문과 대답
mk:@ivt:vccore/F26/D2A/S31BE4.HTM

예외 처리 차이점
mk:@ivt:vccore/F26/D2B/S4CC99.HTM
다음 문서에서는 DAO SDK 예외를 처리하는 EXCEPTEX 샘플 확장하려면 사용되는 기술을 보여 줍니다.
152695Catch 및 DAO SDK 기반 예외 해독할 방법
Win32 예외 처리에 대한 결정적인 원본을 찾을 수 있습니다.

"고급 Windows에서" Jeffrey Richter ISBN 1-57231-548-2

속성

기술 자료: 167802 - 마지막 검토: 2014년 1월 23일 목요일 - 수정: 3.2
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C++ 4.2 Enterprise Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 4.2 Professional Edition
  • Microsoft Visual C++ 5.0 Professional Edition
키워드:?
kbnosurvey kbarchive kbmt kbdownload kbdatabase kbfile kbsample KB167802 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com