Aracılığıyla paylaş


_set_se_translator

Tutamaçları Win32 özel durumlar (C yapılandırılmış özel durum) olarak C++ özel durum yazdınız.

_se_translator_function _set_se_translator(
   _se_translator_function seTransFunction
);

Parametreler

  • seTransFunction
    C işaretçisine yazdığınız özel durum Çevirmen işlevin yapılandırılmış.

Dönüş Değeri

Bir önceki Çevirici işlev işaretçisi kayıtlı olarak döndürür _set_se_translator, böylece önceki işlevi daha sonra geri.Önceki bir işlev kümesi, dönüş değeri varsayılan davranışını geri yüklemek için kullanılabilir; Bu değer NULL olabilir.

Notlar

_set_se_translator İşlev C++ Win32 özel durumlar (C yapılandırılmış özel durumlar) işlemek için bir yol sağlar yazılan özel durumlar.C++ tarafından işlenmek üzere her C özel durumuna izin catch işleyicisi, önce kullanılan veya, belirli bir sınıf türü bir C özel öznitelik için türetilmiş C istisna sarmalayıcı sınıf tanımlayın.Bu sınıf kullanmak için iç özel durum işleme mekanizmasını C özel durum oluşturulmaz her zaman olarak adlandırılan özel C özel durum Çevirmen işlevi yükleyin.Çevirici işlev içinde eşleşen bir C++ tarafından yakalanan herhangi yazılı bir özel durum atar catch işleyicisi.

Kullanmanız gereken /EHa kullanırken, _set_se_translator.

Özel çeviri işlevi belirtmek için arama _set_se_translator , çeviri işlevi, bağımsız değişken olarak adını taşıyan.Her işlev çağrısı olan yığın üzerinde için bir kez yazdığınız Çevirici işlevi çağrılır try engeller.Hiçbir varsayılan çevirici işlevi yoktur.

Çevirmen işlevi bir C++ durum daha fazla yapmalısınız yazılan özel durum.(Bir günlük dosyasına örneğin yazmak gibi) atma yanı sıra herhangi bir şey varsa kaç kez çeviriciyi işlev çağrıldığında platforma bağımlı olduğu için program beklendiği gibi davranmayabilir.

Çok iş parçacıklı ortamda Çevirici işlevler her iş parçacığı için ayrı olarak korunur.Her yeni iş parçacığı kendi çevirmeni işlevini yüklemek gerekiyor.Böylece, her iş parçacığı kendi çeviri işleme sorumlu olur._set_se_translator bir iş parçacığı için özeldir; başka bir DLL farklı çeviri işlevi yükleyebilirsiniz.

seTransFunction Yazdığınız işlevi (/ CLR ile derlenmemiş) yerel derlenmiş bir işlevi olması gerekir.İmzalanmamış bir tamsayı ve bir işaretçi bir Win32 atlamanız şarttır _EXCEPTION_POINTERS bağımsız olarak yapısı.Bağımsız değişkenler için Win32 API çağrıları dönüş değerleri GetExceptionCode ve GetExceptionInformation , sırasıyla çalışır.

typedef void (*_se_translator_function)(unsigned int, struct _EXCEPTION_POINTERS* );

İçin _set_se_translator, bazı olası etkileri için CRT; dinamik olarak bağlama işlem başka bir DLL'de deniyor olabilir _set_se_translator ve işleyicinizi kendi ile değiştirin.

Kullanırken _set_se_translator (/ CLR ile derlenmiş kod) yönetilen koddan veya karışık yerel ve yönetilen kod, yalnızca yerel kodda oluşturulan özel durumlar Çevirici etkilediğine dikkat edin.Herhangi bir yönetilen yönetilen kodda oluşturulan özel durumlar (örneğin yükseltme System::Exception) Çevirici işlevi ile yönlendirilmiyor.Özel durumlar Win32 işlevi kullanılarak yönetilen kodda RaiseException ya da bölme sıfır özel durum tarafından yönlendirilir gibi Çevirmen bir sistem özel durumu nedeniyle.

Gereksinimler

Yordam

Gerekli başlık

_set_se_translator

<EH.h>

Tarafından sağlanan işlevselliği _set_se_translator ile derlenmiş kodda kullanılabilir olmayan /clr: pure derleyici seçeneği.

Daha fazla uyumluluk bilgisi için Giriş altındaki Uyumluluk bölümüne bakın.

Örnek

// 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();
}
  

Tarafından sağlanan işlevselliği rağmen _set_se_translator olan yönetilen kod yok, bu yerel kod derleme altında içinde olsa bile bu yerel kodda eşleme kullanmak mümkündür /clr anahtarı kullanılarak yerel kod belirtilir sürece #pragma unmanaged.Eşlenecek yönetilen kod içinde durum yapılandırılmış özel durum oluşturulursa oluşturur ve özel durum işleme kodu ile işaretlenmiş olmalıdır pragma.Aşağıdaki kod, olası bir kullanımını gösterir.Daha fazla bilgi için bkz. Pragma Yönergeleri ve __Pragma Anahtar Sözcüğü.

// 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 Eşdeğeri

Uygulanamaz. Standart C işlevini çağırmak için PInvoke kullanın. Daha fazla bilgi için bkz. Platform Çağırma Örnekleri.

Ayrıca bkz.

Başvuru

Özel Durum İşleme Rutinleri

set_terminate (CRT)

set_unexpected (CRT)

sonlandır (CRT)

beklenmeyen (CRT)