예외 처리 차이점
모델 계약 형식에서 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 처리기입니다.