_set_se_translator
Win32 özel durum işleme (c yapılandırılmış özel durumlar) özel durumlar C++ yazıldığı gibi.
_se_translator_function _set_se_translator(
_se_translator_function seTransFunction
);
Parametreler
- seTransFunction
İşaretçiyi bir c yazdığınız özel çevirici işlevi yapısal.
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şlev 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 boş olabilir.
Notlar
_set_se_translator İşlevi Win32 özel durumlarý iþlemek için bir yol sağlar (c yapılandırılmış özel durumlar) özel durumlar C++ yazıldığı gibi. C++ tarafından işlenecek c her özel durumuna izin catch işleyicisi ilk kullanılan veya belirli bir sınıf türü c bir özel özniteliği, türetilen bir c istisna sarmalayıcı sınıf tanımlayın. Bu sınıf kullanmak için iç özel durum işleme mekanizması tarafından her zaman c bir özel durum oluşturuldu olarak adlandırılan özel c özel çevirici işlevi yükleyin. Çevirici işlevinizde içinde eşleşen bir C++ tarafından yakalanan yazılı herhangi bir özel durum yaratabiliyorsa catch işleyicisi.
Kullanmanız gereken /EHa kullanırken _set_se_translator.
Özel çeviri işlevi belirtmek için arama _set_se_translator sizin çeviri işlevi argüman olarak adına sahip. Her olan Yığında işlev çağırma için yazdığınız çevirici işlevi bir kez çağrılır try engeller. Hiçbir varsayılan çevirici işlevi yoktur.
Çevirici işlevinizde bir C++ throw'den fazla yapmalısınız yazılan özel durum. (Bir günlük dosyasına, örneğin yazmak gibi) atma ek olarak herhangi bir şey varsa kaç kez çevirici işlev çağrıldığında platforma bağımlı olduğundan program beklendiği gibi davranabilirler değil.
Çok iş parçacıklı ortamda çevirici işlevler her iş parçacığı için ayrı olarak korunur. Her yeni iş parçacığı kendi çevirici 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. Win32 için imzalanmamış bir tamsayı ve bir işaretçi şarttır _EXCEPTION_POINTERS bağımsız olarak yapısı. Dönüş değerleri için Win32 API çağrılarının değişkenlerdir GetExceptionCode ve GetExceptionInformation , sırasıyla çalışır.
typedef void (*_se_translator_function)(unsigned int, struct _EXCEPTION_POINTERS* );
İçin _set_se_translator, dinamik olarak crt için; bağlarken etkileri vardır başka bir işlem DLL'de sağlayabileceğini _set_se_translator ve sizin işleyicisi kendi ile değiştirin.
Kullanırken _set_se_translator tarafından yönetilen kod (/clr ile derlenmiş kodu) veya doğal ve yönetilen kod karışık, çevirici yalnızca yerel kodda oluşturulan özel durumlar etkilediğine dikkat edin. Yönetilen kodda oluşturulan özel durumlar yönetilen herhangi (örneğin yükseltme System::Exception) çevirici işleviyle yönlendirilmiyor. Özel durumlar Win32 işlevi kullanılarak yönetilen kodda harekete geçirilen RaiseException veya Çevirmen bölme sıfır özel durum tarafından yönlendirilen gibi 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ş kod yok /clr: saf derleyici seçeneği.
Daha fazla uyumluluk bilgileri için bkz: Uyumluluk giriş.
Ö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();
}
İşlevleri tarafından sağlanan rağmen _set_se_translator olan yönetilen kod yok, bu yerel kod altında bir derleme içinde olsa bile, bu yerel kodda eşleme kullanmak mümkündür /clr anahtarını kullanarak yerel kodda belirtildiği gibi #pragma unmanaged. Eşlenmiş olması gereken yönetilen kodda yapılandırılmış özel durum oluşturuldu, üretir ve özel durum işleme kodu ile işaretlenmesi gereken pragma. Aşağıdaki kod, olası bir kullanımını gösterir. Daha fazla bilgi için bkz. Pragma yönergeleri ve anahtar sözcük __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 Eşdeğeri
Yoktur. Standart c işlevi çağırmak için kullanmak PInvoke. Daha fazla bilgi için bkz: Platform Çağırma örnekleri.