_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處理常式。
您必須使用 /EHa 時使用_set_se_translator。
若要指定自訂的轉換函式,呼叫_set_se_translator 與您的轉換函式,做為引數的名稱。您撰寫的轉譯器函式呼叫一次,每個函式引動過程已經在堆疊上的try 區塊。沒有預設轉譯器函式。
您的轉譯器函式應如何不必再苦苦非擲回的 C++ 型別例外狀況。如果有任何項目中,除了 (例如寫入記錄檔,例如) 擲回您的程式可能無法如預期般,因為轉譯器函式會叫用次數是平台相關。
在多執行緒環境中,轉譯器函式是分別維護每個執行緒的。每個新的執行緒需要安裝它自己的轉譯器功能。因此,每個執行緒是負責自己的轉譯處理。_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從 managed 程式碼 (使用 /clr 編譯的程式碼) 或混合原生和 managed 程式碼,請注意轉譯程式,將會影響在原生程式碼中產生的例外狀況。任何 managed 例外狀況產生在 managed 程式碼 (例如引發System::Exception) 不會路由到轉譯器函式。在使用 Win32 函式的 managed 程式碼中引發的例外狀況RaiseException或系統例外狀況,例如除以零的例外狀況會經轉換程式所造成。
需求
常式 |
所需的標頭 |
---|---|
_set_se_translator |
<eh.h> |
所提供的功能**_set_se_translator**以編譯的程式碼中沒有 /clr: pure 編譯器選項。
如需相容性資訊,請參閱相容性在簡介中。
範例
// 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是在 managed 程式碼無法使用,就可以使用這項對應原生程式碼,即使該原生程式碼是在編譯中/clr參數,如原生程式碼會指出使用#pragma unmanaged。如果結構化的例外狀況被擲回為對應的 managed 程式碼中,會產生和處理例外狀況的程式碼必須標記為與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。 如需詳細資訊,請參閱平台叫用範例。