EXCEPTEX Tuzaklar MFC ve Win32 Exceptions yapılandırılmış.

Makale çevirileri Makale çevirileri
Makale numarası: 167802 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

EXCEPTEX teknikler için Win32 yapılandırılmış özel durumlar hem de C++ özel durumlar, yakalama gösteren bir örnektir. C++ için özel durumlar, nasıl yapılır: açık daha sık çözülmesi gösteren işlevleri sağlanan çeşitli yardımcı özel sınıflar kullanılır. Win32 yapılandırılmış özel durumlar için Win32 özel durumu oluşturuldu türünü tanıtan bir yardımcı işlev sağlanır.

Aşağıdaki dosyalar Microsoft Yükleme Merkezi'nden yüklenebilir:


Exceptex.exe

Microsoft destek dosyalarını karşıdan yükleme konusunda ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
119591Microsoft Destek Dosyaları Çevrimiçi Hizmetler'den Nasıl Alınır
Microsoft bu dosyada virüs taraması yapmıştır. Microsoft, dosyanın kullanıma sunulduğu tarihteki en güncel virüs tarama yazılımını kullanmıştır. Dosya, üzerinde herhangi bir yetkisiz değişiklik yapılmasını engellemeye yardım eden geliştirilmiş güvenliğe sahip sunucularda depolanır.

Daha fazla bilgi

Win32 ve C++ özel durum işleme birleştirme

C++ özel durum işleme ve Win32 yapılandırılmış özel durum işleme özel durumları yakalamak için farklı bir sözdizimi kullanın.
    // C++ Exception Handler
    try
    {
        // Do something that may raise an exception
    }
    catch( <class name> <instance of class> )
    {
        // handle exception
    }

    // Win32 Structured Exception Handler
    __try
    {
        // Do something that may raise an exception
    }
    __except( expression )
    {
        // handle exception
    }
				
Temel fark, C++ özel durum işleme üç in imzasız yalnızca Win32 yapılandırılmış özel durum işleme yakalar, ancak bir türünün bir örneği catch umuyor being.

Ancak, C++ hem de Win32 _set_se_translator() işlevi işleme Exception birleştirebilirsiniz. Bu Win32 özel durum işleyici işlevi seçiminizin Win32 özel durum bilgileri, bir sınıf içinde kaydırma ve "gibi bir C++ durum", geçirilecek neden olan özel durum. Bu otomatik olarak, bir Win32 Exception oluşur ve sorunsuz bir C++ özel durum olarak program görünür olur (VC) 5.0 infoviewer özel durum işleme değişiklikleri bakın). Bu sizin için otomatik olarak GÜNLÜK makrolar kullanırsanız yapılır ve ilgili Log() işlevlerini destekler.
    // Class for containing information on a Win32 Structured Exception
    class SEH_Exception {
    private:
        SEH_Exception() {}
        unsigned int m_uSECode;
    public:
        SEH_Exception(unsigned int uSECode) : m_uSECode(uSECode) {}
        ~SEH_Exception() {}
        unsigned int getSeHNumber() { return m_uSECode; }
    };

    // Handler function that passes on Win32 Exception information in the
    // C++ class SEH_Exception
    void MappingSEHtoCPPExceptions( unsigned int uExceptionCode,
                                                  _EXCEPTION_POINTERS* )
    {
        throw SEH_Exception( uExceptionCode );
    }

    // Initialize Exception Handling
    void LogEnable( ... )
    {
        // Set Win32 Exceptions to be handled as C++ typed exceptions
        _set_se_translator(MappingSEHtoCPPExceptions);

        ...
    }
				
Böyle bir durumda, LogEnable bir kez, erken programın yürütülmesine çağrılması ve geçirilen Win32 özel durumlar C++ sözdizimiyle yakalandı. EXCEPTEX örnek bu yukarıda verilen kodu kullanarak gösterir.

C++ özel durumlar türleri

Bir MFC-tabanlı program tarafından yakalanan iletiler, C++ özel çeşitli kategorileri vardır:

  • MFC 's sınıfların örneklerini türetilmiş CException
  • Bir Win32 Kapsüllenen sınıfının özel durum
  • Örnekler, Visual C++ 5.0 tarafından geçirilen bir sınıf _com_error, yerel bir COM desteği alma yönergesini üzerinden kullanılabilir.
Bunların her biri için özel durum yakalandı belirli tür için aşırı bir LogException adlı bir işlev EXCEPTEX sunar. Her durumda, bir örneği veya işaretçi bir C++ sınıf genellikle belirli bir türdeki bir özel durum oluşturur. Over-loaded sürümleri LogException C++ yukarıda listelenen özel durum tür vardır.

Aşağıda, MFC CException sınıfını gösteren bir işaretçi yakalar LogException işlevde için bildirim örneğidir.
    // Crack open and log details of different types of exceptions
    extern void LogException( CException    *e,
                              LPCSTR        lpszTimeStamp,
                              LPCSTR        lpszFile,
                              int           nLine        );
				
LogException, özel durum makro son çağrı yığını içinde kullanıldığı dosya adı ve satır numarası da izler (bir yardımcıyı LOG kullandıysanız makro).

Bu yardımcı cracks açık özel işlevleri ve sonuçları gerektiğinde işleyebileceği bir dize dizisi depolar. Bu dize dizisine TRACE() makro içeriği Dökümü alma için LogDisplay() işlevidir.

Try/catch basitleştirme Yardımcısı makrolar ile engeller.

Try/catch bloğu kodunuzda littering bir süre sonra Karmakarışık alabilirsiniz. Ancak, özel durum blokları, makroları basitleştirmek mümkündür. Bu işlemi basitleştirmek için üç makroları EXCEPTEX sağlar ve her günlük/özel durum işleme için farklı işlevler sağlar. Makroları her de yazılır Visual C++ 4.X ve Visual C++ 5.0 için kullandığınız Derleyici sürümü işaretlemeniz gerekir; böylece çalışılır.

Aşağıda makrolar, LOGQ (sessiz özel durum işleme hiçbir günlüğü ile) en basit olanıdır. Bu, kodunuzda bRetVal adlı bir Boolean değişkeni kullanılabilir umuyor. Makro bir özel duruma neden olabilir kodun yürütülmesine izin verebilir böylece doğru olmalıdır ve, bir özel duruma neden oldu, FALSE olarak ayarlar.
    #if _MSC_VER < 1100    // For version VC++ 4.2 or earlier

        #define LOGQ( f ) if( bRetVal == TRUE )                \ 
                          {                                    \ 
                             try                               \ 
                             {                                 \ 
                                 f;                            \ 
                             }                                 \ 
                             catch( CException *e )            \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                                 e->Delete();                  \ 
                             }                                 \ 
                             catch( SEH_Exception )            \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                             }                                 \ 
                             catch(...)                        \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                             }                                 \ 
                          }

    #else

        #define LOGQ( f ) if( bRetVal == TRUE )                \ 
                          {                                    \ 
                             try                               \ 
                             {                                 \ 
                                f;                             \ 
                             }                                 \ 
                             catch( CException *e )            \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                                e->Delete();                   \ 
                             }                                 \ 
                             catch( _com_error )               \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                              }                                \ 
                             catch( SEH_Exception )            \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                             }                                 \ 
                             catch(...)                        \ 
                             {                                 \ 
                                bRetVal = FALSE;               \ 
                             }                                 \ 
                          }

    #endif
				
#Ifdef _MSC_VER Visual C++ 4.X veya 5. 0'de belirli için makroyu tanımını kısıtlar. Sürüm 5.0 için yeni sunulan _com_error özel durum (alma işlemi oluşturulan kod tarafından üretilen) bir catch içerir.

Aşağıda gösterildiği gibi LOGQ kullanırsınız:
    int     i = 0;
    int     j;
    BOOL    bRetVal = TRUE;

    // This code is not safe
    j = 1 / i;        // Raises Win32 Divide By Zero exception

    // This code is safe
    LOGQ( j = 1 / i; )
				
EXCEPTEX tarafından sağlanan <a1>LOG</a1> makroları diğer iki sürümü vardır. Ikinci LOG makronun, yukarıda açıklanan yüklenmiş LogException() yardımcıları kullanır.
    #define LOGE( f ) try                               \ 
                      {                                 \ 
                          f;                            \ 
                      }                                 \ 
                      catch( CException *e )            \ 
                      {                                 \ 
                          LogException( e,              \ 
                                        __TIMESTAMP__,  \ 
                                        __FILE__,       \ 
                                        __LINE__      );\ 
                      }                                 \ 
                      ...
				
Bu makro yok yapmak bayrak bRetVal kullanın. Her zaman tarafından makro kapsüllenmiş kod yürütmesine, geçirilen tüm özel durumları yakalamak ve içeriklerini oturum.

LOGR, EXCEPTEX tarafından sağlanan son LOG makro LOGQ hem LOGE birleştirir. Kodu yürütmesine ve artırılıyor herhangi bir özel durum oturum, görmek için denetler.
    #define LOGR( f ) if( bRetVal == TRUE )                 \ 
                      {                                     \ 
                          try                               \ 
                          {                                 \ 
                              f;                            \ 
                          }                                 \ 
                          catch( CException *e )            \ 
                          {                                 \ 
                              LogException( e,              \ 
                                            __TIMESTAMP__,  \ 
                                            __FILE__,       \ 
                                            __LINE__      );\ 
                              bRetVal = FALSE;              \ 
                          }                                 \ 
                          ...
                        }
				

Diğer bir kullanışlı işlevler

EXCEPTEX örnek özel durum işleme yardımcı olmak üzere üç daha fazla işlev sağlar:
LogDisplay() TRACE makroları aracılığıyla dışında tüm kütüğe kaydedilmiş özel içeriği dökümünü alır.

LogDisplay (...) Tüm kütüğe kaydedilmiş için özel durumlar CListBox örneğini içeriğini dökümünü alır.

LogSaveToFile (...) Içeriği dışında tüm kütüğe kaydedilmiş özel bir dosyaya döker.

LOG.H ve LOG.CPP

LOG.H ve LOG.CPP tüm özel durumları işlemeye EXCEPTEX kodu içerir. Örnek geri kalanı LOG.H ve LOG.CPP bulunan makrolara/işlevleri göstermektir. Bu iki dosyayı varolan bir projeye kolayca eklenebilir ve ya da Visual C++ 4.X içinde derlemeye yazdınız veya altında ANSI hem UNICODE 5.0 oluşturur. Bunları kullanmak için <a0></a0>, # ekleyin "log.h" LOGE veya LOGR makro kullanan dosyaları içerir. Win32 için yapılandırılmış özel durumlar da çözmek istiyorsanız, programınızı başlangıcına yakın bir kez olarak LogEnable çağırmalısınız.
   // One time initialization of data
    LogEnable(false);     // false to verbose mode
				
LOG makro istediğiniz verilerin alınacağı veri özel durum kodunu ekleyin.
   ...
   LOGE(myFunction())
   ...
				
Dosyası ve satır numarası bildirdi Not yığında son LOG makro olacaktır. MyFunction() myFun1() ve myFun2() çağırırsa, her GÜNLÜK bir makro işlev çağrısı çıktının hangi çağrısı bir özel durum oluştu görüntülemek için kaydırma gerekecektir.

Her zaman LOG kullanmak istemeyebilirsiniz makroları veya sağlanan bile LogException() yardımcıları. Her bir kullanışlı olarak sunulur ve gibi kapsamlı bir özel durum işleme göstermek için iyi ve sonuçları, herhangi bir özel durum günlüğünü yakalandı. End-all, özel durum her üretim ortamında işleme için olması-tüm olarak sağlanmaz.

SORUN GİDERME

Aşağıdaki kod nasıl yardımcı makroları
    LOGQ( int i = 0; )
    LOGQ( int j = 1 / i; )    // Will this raise a divide by zero?
				
i, yalnızca ilk LOGQ makro kapsamında tanımlandığı gibi bu kodu bir derleyici hata üretir. LOGQ biçimde genişler unutmayın:
>
    ...
    try
    {
        int i = 0;
    }
    ...

    ...
    try
    {
        int j = 1 / i;  // error C2065: 'i' : undeclared
    }
    ...
				

/ W4 ve alma

Visual C++ ve alma /W4 bayrağı kullanıyorsanız, 8 uyarıları alma kullanan içerme dosyaları teslim oluşturulan görürsünüz.
comutil.h(905): C4310 Uyarı: oyuncu sabit değeri tamsayıya yuvarlar.
comutil.h(928): C4310 Uyarı: oyuncu sabit değeri tamsayıya yuvarlar.
comutil.h(1030): C4310 Uyarı: oyuncu sabit değeri tamsayıya yuvarlar.
comutil.h(1281): C4310 Uyarı: oyuncu sabit değeri tamsayıya yuvarlar.
comutil.h(1307): C4310 Uyarı: oyuncu sabit değeri tamsayıya yuvarlar.
comutil.h(1476): C4310 Uyarı: oyuncu sabit değeri tamsayıya yuvarlar.
comdef.h(242): C4244 Uyarı: 'iade': 'int' dan 'imzasız kısa', olası kaybını verileri dönüştürme
Bu hata iletileri sayılabilir ve kodunuzu etkilememelidir.

Daha fazla bilgi için

Aşağıdaki VC ++ 5.0 infoviewer konuya özel durum teknikleri işleme için iyi bir giriş sunar:
Özel durum işleme: Sık sorulan sorular
MK:@IVT:vccore/F26/D2A/S31BE4.HTM

Özel durum işleme farklar
MK:@IVT:vccore/F26/D2B/S4CC99.HTM
Aşağıdaki makalede DAO SDK özel durum işlenecek EXCEPTEX örnek genişletmek için kullanılacak teknikler gösterilmiştir.
152695Nasıl tut ve özel durumlar, SDK-based DAO Şifre Çöz
Win32 özel durum işleme üzerinde kesin bir kaynak bulunamıyor:

"Gelişmiş Windows" tarafından Jeffrey Richter, ISBN 1-57231-548-2

Özellikler

Makale numarası: 167802 - Last Review: 7 Şubat 2014 Cuma - Gözden geçirme: 3.2
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C++ 4.2 Enterprise Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Aboneliği
  • Microsoft Visual C++ 4.2 Professional Edition
  • Microsoft Visual C++ 5.0 Professional Edition
Anahtar Kelimeler: 
kbnosurvey kbarchive kbmt kbdownload kbdatabase kbfile kbsample KB167802 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:167802

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com