共用方式為


_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。 如需詳細資訊,請參閱平台叫用範例

請參閱

參考

例外狀況處理常式

set_terminate (CRT)

set_unexpected (CRT)

terminate (CRT)

unexpected (CRT)