다음을 통해 공유


예외 처리 차이점

모델 계약 형식에서 C++ 예외는, C 동안 구조적된 예외 처리 모델 한 종류의 예외 처리는 구조적된 예외 처리 및 C++ 예외 처리의 주요 차이점입니다-특히, unsigned int.즉, C++ 예외 데이터 형식으로 식별 되는 반면 C 예외는 부호 없는 정수 값으로 식별 됩니다.C에서 예외가 발생 하는 경우 각 가능한 처리기 C 예외 컨텍스트를 조사 하 고 예외 허용, 일부 다른 처리기로 전달 하거나 무시할 것인지 여부를 결정 하는 필터를 실행 합니다.C + +에서 예외가 발생 하는 경우 모든 종류의 수 있습니다.

두 번째 차이점은 예외는 정상적인 제어 흐름에 보조 발생 한다는 점에서 C 구조적된 예외 처리 모델은 "비동기 수" 라고 있습니다.C + + 예외 처리 메커니즘만 때가 throw 된 예외가 발생 하는 것을 의미 하는 완전 하 게 "동기"입니다.

C + + 프로그램에서 C는 예외가 발생 한 경우는 C++ 또는 구조적된 예외 처리기와 연결 된 필터를 처리할 수 있습니다 catch 처리기 중 이며, 동적으로 예외 컨텍스트를 가까이 있습니다.예를 들어, 다음 C++ 프로그램은 C++ 내의 C 예외 발생 시도 컨텍스트:

예제

// exceptions_Exception_Handling_Differences.cpp
// compile with: /EHa
#include <iostream>

using namespace std;
void SEHFunc( void );

int main() {
   try {
      SEHFunc();
   }
   catch( ... ) {
      cout << "Caught a C exception."<< endl;
   }
}

void SEHFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
   }
   __finally {
      cout << "In finally." << endl;
   }
}
  
  

예를 들어, 다음 코드는 사용자 지정 변환 기능을 설치 하 고 다음으로 래핑하는 C 예외를 발생 시킵니다는 SE_Exception 클래스:

// exceptions_Exception_Handling_Differences3.cpp
// compile with: /EHa
#include <stdio.h>
#include <eh.h>
#include <windows.h>

class SE_Exception {
private:
   SE_Exception() {}
   unsigned int nSE;

public:
   SE_Exception( SE_Exception& e) : nSE(e.nSE) {}
   SE_Exception(unsigned int n) : nSE(n) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() { return nSE; }
};

void SEFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
    }
    __finally {
      printf_s( "In finally\n" );
   }
}

void trans_func( unsigned int u, _EXCEPTION_POINTERS* pExp ) {
   printf_s( "In trans_func.\n" );
   throw SE_Exception( u );
}

int main() {
   _set_se_translator( trans_func );
    try {
      SEFunc();
    }
    catch( SE_Exception e ) {
      printf_s( "Caught a __try exception with SE_Exception.\n" );
      printf_s( "nSE = 0x%x\n", e.getSeNumber() );
    }
}
  
  
  

C 예외 래퍼 클래스

위와 같은 간단한 예제에서는 줄임표로만 C 예외 catch 할 수 있습니다 (...) catch 처리기입니다.형식 또는 특성을 예외에 대 한 정보가 없습니다 처리기에 전달 됩니다.이 메서드가 작동 하는 동안 경우도 하면 각 C 예외 특정 클래스와 관련 된 두 가지 예외 처리 모델 간의 변환을 정의 해야 합니다.이 위해 사용 되는 또는 C 예외에는 특정 클래스 형식 특성을 파생는 C 예외 "래퍼" 클래스를 정의할 수 있습니다.이렇게 하면 각 C 예외는 C++에서 처리할 수 catch 처리기 보다 개별적으로 앞의 예제입니다.

래퍼 클래스는 일부 멤버 함수는 값의 예외를 확인 하 고는 C 예외 모델에서 제공 되는 확장된 예외 컨텍스트 정보에 액세스 구성 된 인터페이스가 있을 수 있습니다.받는 생성자 및 기본 생성자를 지정할 수도 있습니다 있는 unsigned int 인수 (기본 C 예외 표현에 대 한 제공) 및 비트 복사 생성자입니다.다음 C 예외 래퍼 클래스를 구현 중입니다.

// exceptions_Exception_Handling_Differences2.cpp
// compile with: /c
class SE_Exception {
private:
   SE_Exception() {}
   SE_Exception( SE_Exception& ) {}
   unsigned int nSE;
public:
   SE_Exception( unsigned int n ) : nSE( n ) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() {
      return nSE;
   }
};

이 클래스를 사용 하 여 내부 예외 처리 메커니즘 C 예외가 throw 될 때마다 호출 되는 C 사용자 지정 예외 변환 기능을 설치 합니다.사용자 변환 함수 내에서 모든 형식의 예외를 throw 하 (아마도 SE_Exception 형식이 나 클래스 형식에서 파생 SE_Exception)는 수 수 포착 c +에서 적절 한 일치 하는 + catch 처리기입니다.변환 함수를 간단 하 게, 예외를 처리 하지 못했습니다 나타냅니다 반환할 수 있습니다.변환 함수를 C 예외를 발생 시키는 경우 종료 라고 합니다.

사용자 정의 변환 함수를 지정 하기 위해 호출을 _set_se_translator 하나의 인수로 변환 함수의 이름 가진 함수입니다.스택에 있는 각 함수 호출에 대 한 한 번 쓰기 변환 함수를 호출할 시도 블록입니다.기본 변환 함수가 있습니다. 호출 하 여 지정 하지 않은 경우 _set_se_translator, C 예외에 줄임표가 catch 할 수 있습니다 catch 처리기입니다.

참고 항목

참조

(구조적) C 및 C++ 예외를 혼합 합니다.