EXCEPTEX Traps MFC und Win32 strukturierte Ausnahmen

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 167802 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

EXCEPTEX ist ein Beispiel, das Verfahren zum Trapping von Win32 Structured Ausnahmen und C++-Ausnahmen veranschaulicht. Für C++ Ausnahmen, verschiedene Helfer Funktionen bereitgestellt werden, die zum Öffnen der häufiger knacken veranschaulichen Ausnahmeklassen verwendet. Für Win32 strukturierte Ausnahmen ist eine Hilfsfunktion bereitgestellt, die den Typ des Win32-Ausnahme angibt.

Die folgenden Dateien stehen im Microsoft Download Center zum Download zur Verfügung:


Exceptex.exe

Weitere Informationen zum Download von Microsoft Support-Dateien finden Sie in folgendem Artikel der Microsoft Knowledge Base:
119591So erhalten Sie Dateien vom Microsoft Support im Internet
Microsoft hat diese Datei auf Viren überprüft. Microsoft hat dazu die neueste Software zur Virenerkennung verwendet, die zum Zeitpunkt der Bereitstellung verfügbar war. Die Datei befindet sich auf Servern mit verstärkter Sicherheit, wodurch nicht autorisierte Änderungen an der Datei weitestgehend verhindert werden.

Weitere Informationen

Zusammenführen von Win32- und C++-Ausnahmebehandlung

Behandlung von C++-Ausnahmen und Win32 strukturierte Ausnahmebehandlung verwenden Sie unterschiedliche Syntax, um Ausnahmen aufzufangen.
    // 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
    }
				
der grundlegende Unterschied, dass C++-Ausnahmebehandlung erwartet, eine Instanz eines Typs catch während Win32 strukturierte Ausnahmebehandlung fängt nur drei Ganzzahlen ohne Vorzeichen.

Sie können jedoch C++- und Win32-Ausnahme über die Funktion _set_se_translator() Behandlung zusammenführen. Eine Win32-Ausnahme, die an die Handlerfunktion Ihrer Wahl übergeben werden, die Win32-Ausnahme-Informationen in einer Klasse einschließen und "throw" es als eine C++ können dadurch Ausnahme. Dies geschieht automatisch, wenn eine Win32-Ausnahme tritt auf, und nahtlos an das Programm als C++-Ausnahme angezeigt (siehe Ausnahme behandeln Unterschiede in der VC-5.0-Infoviewer). Dies ist durchgeführt für Sie automatisch, wenn Sie die LOG-Makros verwenden und Verwandte log() Funktionen unterstützen.
    // 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);

        ...
    }
				
in diesem Fall LogEnable würde aufgerufen werden einmal, frühzeitig in der Programmausführung und Win32-Ausnahmen ausgelöst konnte mit C++-Syntax abgefangen werden. Die EXCEPTEX-Beispiel veranschaulicht dies mit dem oben angegebenen Code.

Typen von C++-Ausnahmen

Es gibt mehrere Kategorien des C++-Ausnahmen, die von einem MFC-basierten Programm abgefangen werden kann:

  • Instanzen von Klassen abgeleitet MFC CException
  • Instanzen einer Klasse kapseln eine Win32-Ausnahme
  • Instanzen ein _com_error-Klasse das vom Visual C++ 5.0 ausgelöst wird systemeigene COM-Unterstützung über # Import-Direktive.
Für jede dieser bietet EXCEPTEX eine Funktion namens LogException, Überladen für den bestimmten Typ von Ausnahme abgefangen wird. In jedem Fall löst eine Ausnahme eine Instanz oder einen Zeiger eines bestimmten Typs in der Regel eine C++-Klasse. Es gibt over-loaded Versionen von LogException für jede der C++-Ausnahme aufgeführten Dateitypen.

Unten ist ein Beispiel der Deklaration für die überladene LogException-Funktion, die einen Zeiger auf MFC CException-Klasse abfängt.
    // Crack open and log details of different types of exceptions
    extern void LogException( CException    *e,
                              LPCSTR        lpszTimeStamp,
                              LPCSTR        lpszFile,
                              int           nLine        );
				
LogException verfolgt außerdem die Datei Name und die Zeilennummer, in dem das Makro Ausnahme zuletzt in der Aufrufliste verwendet wurde (Wenn ein Hilfsprogramm LOG verwendet Makro).

Jeder dieser Helfer Funktionen Risse öffnen Sie die Ausnahme und speichert die Ergebnisse in ein Zeichenfolgenarray, die Sie bei Bedarf verarbeiten können. Die Funktion für den Inhalt dieser Zeichenfolgenarrays an das TRACE()-Makro abbilden ist LogDisplay().

Vereinfachen der Try-Catch Blöcke mit Hilfe von Makros

Try-Catch-Blöcke in Ihrem Code littering erhalten unübersichtlich nach einer Weile. Es ist jedoch möglich, Ausnahmeblöcke durch die Verwendung von Makros zu vereinfachen. EXCEPTEX stellt drei Makros zur Vereinfachung dieses Vorgangs und jede andere Funktionen für die Protokollierung/Behandlung von Ausnahmen bietet. Jede die Makros werden auch für Visual C++ 4.X und Visual C++ 5.0 arbeiten, müssen Sie die Version des Compilers verwenden überprüfen geschrieben.

Nachfolgend ist die einfachste der Makros LOGQ (quiet Ausnahmebehandlung mit keine Protokollierung). Es erwartet, dass eine boolesche Variable mit dem Namen bRetVal in Ihrem Code verfügbar ist. Es muss true sein, damit das Makro Ausführung des Codes ermöglichen kann, die eine Ausnahme auslösen kann, und es auf FALSE, wenn eine Ausnahme ausgelöst wird festgelegt.
    #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 schränkt die Definition eines Makros, das spezifisch für Visual C++ 4.X oder 5.0. 5.0 Version enthält einen Catch für die neu eingeführten _com_error-Ausnahme (generiert durch Code von # Import erstellt).

Sie würden LOGQ verwenden, wie unten dargestellt:
    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; )
				
es sind zwei andere Versionen der LOG-Makros von EXCEPTEX bereitgestellt. Das zweite Makro LOG verwendet den überladenen LogException() Hilfsprogramme wie oben beschrieben.
    #define LOGE( f ) try                               \ 
                      {                                 \ 
                          f;                            \ 
                      }                                 \ 
                      catch( CException *e )            \ 
                      {                                 \ 
                          LogException( e,              \ 
                                        __TIMESTAMP__,  \ 
                                        __FILE__,       \ 
                                        __LINE__      );\ 
                      }                                 \ 
                      ...
				
dieses Makro macht nicht Flag bRetVal verwenden. Immer wird den Code gekapselt, durch das Makro ausführen, alle Ausnahmen ausgelöst und protokollieren deren Inhalt.

Das endgültige LOG Makro EXCEPTEX, LOGR, bereitgestellten kombiniert beide LOGQ und LOGE. Es überprüft, wenn sollte den Code ausführen, und protokollieren Ausnahme ausgelöst wird.
    #define LOGR( f ) if( bRetVal == TRUE )                 \ 
                      {                                     \ 
                          try                               \ 
                          {                                 \ 
                              f;                            \ 
                          }                                 \ 
                          catch( CException *e )            \ 
                          {                                 \ 
                              LogException( e,              \ 
                                            __TIMESTAMP__,  \ 
                                            __FILE__,       \ 
                                            __LINE__      );\ 
                              bRetVal = FALSE;              \ 
                          }                                 \ 
                          ...
                        }
				

Andere nützlichen Funktion

Im Beispiel EXCEPTEX bietet drei weitere Funktionen, die Ausnahmebehandlung unterstützen:
LogDisplay() Inhalt der protokollierten Ausnahmen out über TRACE-Makros bildet.

LogDisplay (...) Inhalt der protokollierten Ausnahmen, zu einer Instanz von CListBox bildet.

LogSaveToFile (...) Inhalt der protokollierten Ausnahmen out in einer Datei sichert.

LOG.H und LOG.CPP

LOG.H und LOG.CPP enthalten alle des Codes in EXCEPTEX, Ausnahmen zu behandeln. Der Rest des Beispiels ist die Makros/Funktionen in LOG.H und LOG.CPP zu demonstrieren. Diese beiden Dateien können problemlos zu einem vorhandenen Projekt hinzugefügt werden und haben so kompilieren Sie entweder Visual C++ 4.X geschrieben wurde oder unter ANSI und UNICODE 5.0 erstellt. Fügen Sie #, um Sie verwenden "log.h" enthalten, um die Dateien, die das Makro LOGE oder LOGR verwendet werden. Wenn Sie Win32 strukturierte Ausnahmen auch entschlüsseln möchten, müssen Sie LogEnable einmal am Anfang des Programms aufrufen.
   // One time initialization of data
    LogEnable(false);     // false to verbose mode
				
hinzufügen das LOG-Makro in Code Ausnahmedaten abgerufen werden soll.
   ...
   LOGE(myFunction())
   ...
				
beachten, die die Datei und Zeilennummer gemeldet werden die letzten LOG Makro auf dem Stapel. Wenn myFunction() myFun1() und myFun2() aufruft, müssen Sie die wrap jeden Funktionsaufruf mit einem Makro LOG für die Ausgabe an der Aufruf, die der Ausnahme in.

Möglicherweise nicht immer soll der LOGARITHMUS Makros oder sogar die LogException()-Hilfsprogramme wie angegeben. Werden Sie beide aus Gründen der Benutzerfreundlichkeit angeboten und als gut als um umfassende Ausnahmebehandlung veranschaulichen und zum Protokollieren der Ergebnisse eine Ausnahme abgefangen. Sie werden nicht als End-all, werden alle für die Ausnahmebehandlung in jeder Produktionsumgebung bereitgestellt.

Problembehandlung

Der folgenden Code veranschaulicht nicht mit der Helfer Makros
    LOGQ( int i = 0; )
    LOGQ( int j = 1 / i; )    // Will this raise a divide by zero?
				
dieser Code generiert einen Compilerfehler wie i nur in den Umfang der erste LOGQ Makro definiert ist. Denken Sie daran, dass LOGQ zum erweitert:
>
    ...
    try
    {
        int i = 0;
    }
    ...

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

/ W4 und # Import

Wenn Sie das Flag/W4 in Visual C++ und # Import verwenden, sehen Sie 8 deaktiviert die Include-Dateien, die # Import nutzt generierte Warnungen.
comutil.h(905): Warnung C4310: Typumwandlung verkürzt Konstanten Wert
comutil.h(928): Warnung C4310: Typumwandlung verkürzt Konstanten Wert
comutil.h(1030): Warnung C4310: Typumwandlung verkürzt Konstanten Wert
comutil.h(1281): Warnung C4310: Typumwandlung verkürzt Konstanten Wert
comutil.h(1307): Warnung C4310: Typumwandlung verkürzt Konstanten Wert
comutil.h(1476): Warnung C4310: Typumwandlung verkürzt Konstanten Wert
comdef.h(242): Warnung C4244: 'return': Konvertierung von 'Int' in 'unsigned short', möglicher Verlust von Daten
Diese Fehlermeldungen können ignoriert werden und Ihr Code nicht beeinträchtigen sollte.

Weitere Informationen

Im folgende VC++ 5.0 Infoviewer Thema stellen eine gute Einführung in die Techniken für die Ausnahmebehandlung:
Ausnahmebehandlung: Häufig gestellte Fragen
mk:@IVT:vccore/F26/D2A/S31BE4.HTM

Ausnahme behandeln Unterschiede
mk:@IVT:vccore/F26/D2B/S4CC99.HTM
Im folgende Artikel veranschaulicht Techniken, die das EXCEPTEX-Beispiel DAO SDK Ausnahmen behandeln, erweitern Sie verwendet werden könnten.
152695Wie Sie catch und Entschlüsseln von DAO SDK-basierten Ausnahmen
Eine maßgebliche Quelle auf Win32-Ausnahmebehandlung finden Sie in:

"Erweiterte Windows von Jeffrey Richter, ISBN 1-57231-548-2"

Eigenschaften

Artikel-ID: 167802 - Geändert am: Freitag, 24. Januar 2014 - Version: 3.2
Die Informationen in diesem Artikel beziehen sich auf:
  • 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 Subscription
  • Microsoft Visual C++ 4.2 Professional Edition
  • Microsoft Visual C++ 5.0 Professional Edition
Keywords: 
kbnosurvey kbarchive kbmt kbdownload kbdatabase kbfile kbsample KB167802 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 167802
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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