_set_se_translator
Win32 예외 처리 (C 구조적 예외) C++ 예외 입력 한 대로.
_se_translator_function _set_se_translator(
_se_translator_function seTransFunction
);
매개 변수
- seTransFunction
C 포인터 예외 변환기 함수를 작성 하 여 구조.
반환 값
이전 변환기 함수에 대 한 포인터를 등록 하 여 반환 _set_se_translator, 이전 함수는 나중에 복원할 수 있도록 합니다.이전 함수가 설정 된 경우 반환 값의 기본 동작을 복원 하려면 사용할 수 있습니다. 이 값은 NULL 일 수 있습니다.
설명
_set_se_translator 함수 Win32 예외를 처리 하는 방법을 제공 합니다 (C 구조적 예외) C++ 예외 입력 한 대로.각 C 예외는 C++에서 처리 될 수 있도록 catch 처리기를 먼저 사용할 경우 또는 C 예외에는 특정 클래스 형식 특성에서 파생 하는 C 예외 래퍼 클래스를 정의 합니다.이 클래스를 사용 하려면 내부 예외 처리 메커니즘 C 예외 발생 될 때마다 호출 되는 C 사용자 지정 예외 변환기 함수를 설치 합니다.사용자 변환기 함수 내에서 일치 하는 C++에서 catch 할 수 있습니다 모든 형식의 예외를 throw 될 수 있습니다 catch 처리기입니다.
사용 하 여 /EHa 를 사용할 때 _set_se_translator.
호출 하는 사용자 지정 변환 기능을 지정 하려면 _set_se_translator 인수로 변환 함수의 이름입니다.스택에 있는 각 함수 호출에 대해 한 번 작성 변환기 함수를 호출할 try 블록입니다.기본 변환기는 함수가 있습니다.
변환기 함수는 C++ throw 하는 것 보다 더 이상 수행 해야 할 입력 된 예외입니다.(로그 파일을 예를 들어 작성 등)를 throw 하는 것 외에 아무 것도 하지 않을 경우 변환기 함수 호출 횟수 플랫폼 종속 있기 때문에 프로그램이 예상 대로 동작할 수 있습니다.
다중 스레드 환경에서 번역기 기능 각 스레드에 대해 별도로 유지 됩니다.각 새 스레드 번역기 기능을 설치 해야 합니다.따라서 각 스레드가 자체 번역 처리 담당입니다._set_se_translator 하나의 스레드에 적용 됩니다. 다른 DLL에 다른 변환 기능을 설치할 수 있습니다.
seTransFunction 함수를 작성 하 여 함수가 네이티브로 컴파일할 (/clr으로 컴파일된) 이어야 합니다.Win32를 부호 없는 정수에 대 한 포인터 사용 해야 _EXCEPTION_POINTERS 인수와 구조입니다.반환 값을 Win32 API를 호출 하는 인수는 GetExceptionCode 및 GetExceptionInformation , 각각 작동 합니다.
typedef void (*_se_translator_function)(unsigned int, struct _EXCEPTION_POINTERS* );
에 대 한 _set_se_translator, CRT에 동적으로 링크할 때 의미입니다. 다른 프로세스에서 DLL을 호출할 수 있습니다 _set_se_translator 처리기 자체를 교체 하 고 있습니다.
사용 하는 경우 _set_se_translator 에서 관리 되는 코드 (/clr으로 컴파일한 코드) 또는 혼합 네이티브 코드와 관리 되는 코드에서 변환기는 네이티브 코드에서 생성 된 예외에 영향을 주는 유의 합니다.관리 되는 관리 코드에서 생성 된 예외 (경우 처럼 발생 시키는 System::Exception) 변환기 함수를 통해 라우팅됩니다.Win32 함수를 사용 하 여 관리 코드에서 발생 하는 예외 RaiseException 또는 예외 0으로 나누기도 보내는 처럼 번역기를 통해 예외 시스템 때문에 발생 합니다.
요구 사항
루틴 |
필수 헤더 |
---|---|
_set_se_translator |
<eh.h> |
가 제공 하는 기능은 _set_se_translator 를 사용 하 여 컴파일된 코드에서 사용할 수 없습니다의 /clr: 순수 컴파일러 옵션.
더 많은 호환성 정보를 참조 하십시오. 호환성 소개에서 합니다.
예제
// crt_settrans.cpp
// compile with: /EHa
#include <stdio.h>
#include <windows.h>
#include <eh.h>
void SEFunc();
void trans_func( unsigned int, EXCEPTION_POINTERS* );
class SE_Exception
{
private:
unsigned int nSE;
public:
SE_Exception() {}
SE_Exception( unsigned int n ) : nSE( n ) {}
~SE_Exception() {}
unsigned int getSeNumber() { return nSE; }
};
int main( void )
{
try
{
_set_se_translator( trans_func );
SEFunc();
}
catch( SE_Exception e )
{
printf( "Caught a __try exception with SE_Exception.\n" );
}
}
void SEFunc()
{
__try
{
int x, y=0;
x = 5 / y;
}
__finally
{
printf( "In finally\n" );
}
}
void trans_func( unsigned int u, EXCEPTION_POINTERS* pExp )
{
printf( "In trans_func.\n" );
throw SE_Exception();
}
기능을 제공 하지만 _set_se_translator 되지 않습니다 사용할 수 있는 관리 코드에 네이티브 코드 컴파일에 인 경우에이 네이티브 코드에서 매핑을 사용 하 가능의 /clr 네이티브 코드를 사용 하 여 표시 되는 전환 #pragma unmanaged.생성 하 고 예외를 처리 하는 코드를 매핑할 관리 되는 코드에서 구조적된 예외를 throw 하는 경우 표시 되어야 합니다는 pragma.다음 코드는 가능한 사용을 보여 줍니다.자세한 내용은 Pragma 지시문과 __Pragma 키워드를 참조하십시오.
// crt_set_se_translator_clr.cpp
// compile with: /clr
#include <windows.h>
#include <eh.h>
#include <assert.h>
#include <stdio.h>
int thrower_func(int i) {
int j = i/0;
return 0;
}
class CMyException{
};
#pragma unmanaged
void my_trans_func(unsigned int u, PEXCEPTION_POINTERS pExp )
{
printf("Translating the structured exception to a C++"
" exception.\n");
throw CMyException();
}
void DoTest()
{
try
{
thrower_func(10);
}
catch(CMyException e)
{
printf("Caught CMyException.\n");
}
catch(...)
{
printf("Caught unexpected SEH exception.\n");
}
}
#pragma managed
int main(int argc, char** argv) {
_set_se_translator(my_trans_func);
DoTest();
return 0;
}
해당 .NET Framework 항목
해당 사항 없음. 표준 C 함수를 호출할 수 있습니다 PInvoke. 자세한 내용은 플랫폼 호출 예제.