Trap EXCEPTEX MFC e Win32 di eccezioni strutturata

Traduzione articoli Traduzione articoli
Identificativo articolo: 167802 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo Ŕ stato archiviato. L?articolo, quindi, viene offerto ?cosý come Ŕ? e non verrÓ pi¨ aggiornato.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

EXCEPTEX Ŕ un esempio che illustra le tecniche per la registrazione dei colori di eccezioni strutturata di Win32 ed eccezioni c ++. Per c ++ eccezioni, supporto diversi sono disponibili funzioni che illustrano come violare aprire pi¨ comunemente utilizzate classi di eccezione. Per le eccezioni strutturata di Win32, una funzione di supporto viene fornito che identifica il tipo di eccezione Win32.

Sono disponibili i file seguenti dall'Area download Microsoft:


Exceptex.exe

Per ulteriori informazioni su come scaricare file di supporto Microsoft, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
119591Come ottenere file di supporto Microsoft dai servizi online
Microsoft analizzati questo file per individuare eventuali virus. Microsoft ha utilizzato il software antivirus pi¨ recente disponibile alla data di pubblicazione del file. Il file Ŕ archiviato in server con protezione avanzata per impedire modifiche non autorizzate al file.

Informazioni

Unione di Win32 e di gestione delle eccezioni c ++

La gestione di eccezioni c ++ e la gestione delle eccezioni Win32 strutturata Ŕ possibile utilizzare diverse sintassi per intercettare eccezioni.
    // 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
    }
				
fondamentali differenza che la gestione delle eccezioni c ++ prevede catch di un'istanza di un tipo, mentre la gestione delle eccezioni Win32 strutturata rileva solo tre unsigned int.

╚ tuttavia possibile unire sia c ++ e la gestione delle tramite la funzione _set_se_translator () di eccezioni di Win32. Causando un'eccezione Win32 da passare alla funzione del gestore prescelta, che consente di racchiudere eccezioni Win32 informazioni in una classe e "generare" come un c ++ eccezione. Ci˛ accade automaticamente quando si verifica un'eccezione Win32 e viene visualizzata senza problemi per il programma come eccezione c ++ (vedere differenze di gestione di eccezioni in infoviewer di VC 5.0). Si tratta di operazione eseguita automaticamente se si utilizzano le macro LOG e correlato supportano funzioni Log().
    // 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);

        ...
    }
				
LogEnable dovrebbe essere chiamato una volta, all'inizio nell'esecuzione del programma in questo caso, e tutte le eccezioni Win32 generate possono essere intercettate con sintassi c ++. Il EXCEPTEX esempio viene illustrato questo utilizzando il codice indicato in precedenza.

Tipi di eccezioni c ++

Sono disponibili varie categorie di eccezioni di c ++ che possono essere intercettate da un programma basati su MFC:

  • Le istanze delle classi derivate da MFC CException
  • Le istanze di una classe che incapsula un Win32 eccezione
  • Le istanze di un _com_error di classe che viene generato da Visual c ++ 5.0 supporto disponibile tramite la direttiva # import COM nativo.
Per ciascuno di questi, EXCEPTEX offre una funzione denominata LogException, overload per il tipo specifico di eccezione che venga rilevata. In ogni caso, un'eccezione genera un'istanza o un puntatore di un tipo specifico, in genere una classe c ++. Esistono versioni over-loaded di LogException per ciascuno dei tipi di eccezione c ++ sopra elencati.

Di seguito Ŕ un esempio della dichiarazione della funzione sovraccaricata LogException che intercetta un puntatore alla classe CException MFC.
    // Crack open and log details of different types of exceptions
    extern void LogException( CException    *e,
                              LPCSTR        lpszTimeStamp,
                              LPCSTR        lpszFile,
                              int           nLine        );
				
LogException inoltre tiene traccia del nome file e riga il numero in cui la macro di eccezione ultimo Ŕ stata utilizzata nello stack di chiamate (se utilizzato con un supporto di LOG macro).

Ciascuno di questi supporto funzioni crack aprire l'eccezione e si memorizza i risultati in una matrice di stringa che Ŕ possibile elaborare secondo le necessitÓ. La funzione per il dump del contenuto di questa matrice di stringa alla macro TRACE() Ŕ LogDisplay().

Semplificazione di try/catch blocchi con macro di supporto

Sovraccaricare di blocchi try/catch nel codice possono ottenere disordinato dopo un certo periodo di tempo. Tuttavia, Ŕ possibile semplificare i blocchi di eccezione mediante l'utilizzo di macro. EXCEPTEX fornisce tre macro per semplificare il processo e ogni offre funzionalitÓ differenti per registrazione/gestione delle eccezioni. Inoltre ogni le macro vengono scritte funziona sia per Visual c ++ 4.X che Visual c ++ 5.0, pertanto Ŕ necessario controllare la versione del compilatore si utilizza.

Di seguito Ŕ pi¨ semplice delle macro, LOGQ (non interattiva gestione eccezioni con nessuna registrazione). Prevede che una variabile Boolean denominata bRetVal Ŕ disponibile nel codice. Deve essere true in modo che la macro Ŕ possibile consentire l'esecuzione del codice che potrebbe generare un'eccezione, e impostata su FALSE se viene generata un'eccezione.
    #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
				
il _MSC_VER # ifdef limita la definizione di macro specifiche di Visual c ++ 4.X o 5.0. La versione 5.0 include un blocco catch dell'eccezione appena introdotta _com_error (generato dal codice creato da # import).

╚ necessario utilizzare LOGQ, come illustrato sotto:
    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; )
				
sono disponibili due altre versioni delle macro LOG fornite da EXCEPTEX. La seconda macro LOG utilizza gli helper LogException() overload descritti in precedenza.
    #define LOGE( f ) try                               \ 
                      {                                 \ 
                          f;                            \ 
                      }                                 \ 
                      catch( CException *e )            \ 
                      {                                 \ 
                          LogException( e,              \ 
                                        __TIMESTAMP__,  \ 
                                        __FILE__,       \ 
                                        __LINE__      );\ 
                      }                                 \ 
                      ...
				
non rende questa macro utilizzare bRetVal il flag. VerrÓ sempre eseguire il codice incapsulato dalla macro, catch di tutte le eccezioni generate e registrare il relativo contenuto.

La macro LOG finale fornita da EXCEPTEX, LOGR, combina sia LOGE che LOGQ. Verifica se deve eseguire il codice e registrare qualsiasi eccezione che viene generato.
    #define LOGR( f ) if( bRetVal == TRUE )                 \ 
                      {                                     \ 
                          try                               \ 
                          {                                 \ 
                              f;                            \ 
                          }                                 \ 
                          catch( CException *e )            \ 
                          {                                 \ 
                              LogException( e,              \ 
                                            __TIMESTAMP__,  \ 
                                            __FILE__,       \ 
                                            __LINE__      );\ 
                              bRetVal = FALSE;              \ 
                          }                                 \ 
                          ...
                        }
				

Altre funzioni utili

L'esempio EXCEPTEX fornisce tre ulteriori funzioni per agevolare la gestione delle eccezioni:
LogDisplay() Trasferisce il contenuto di tutte le eccezioni connessione uscita tramite macro TRACE.

LogDisplay (...) Trasferisce il contenuto di tutte le eccezioni connessione uscita a un'istanza di CListBox.

LogSaveToFile (...) Trasferisce il contenuto di tutte le eccezioni connessione out in un file.

LOG.H e LOG.CPP

LOG.H e LOG.CPP contengono tutte il codice in EXCEPTEX per la gestione delle eccezioni. Mentre il resto dell'esempio Ŕ per illustrare le macro/funzioni disponibili in LOG.H e LOG.CPP. Questi due file Ŕ possibile aggiungere a un progetto esistente e sono stati scritti compilare entrambi 4.X di Visual c ++ o genera 5.0 sia ANSI in UNICODE. Per utilizzarli, aggiungere # include "log.h" ai file che verranno utilizzata la macro LOGE o LOGR. Se si desidera violare anche eccezioni strutturata di Win32, Ŕ necessario chiamare una volta LogEnable nella parte iniziale del programma.
   // One time initialization of data
    LogEnable(false);     // false to verbose mode
				
aggiungere la macro LOG nel codice che si desidera ottenere dati di eccezione da.
   ...
   LOGE(myFunction())
   ...
				
si noti che il numero di file e riga riportato sarÓ l'ultima macro reg nello stack. MyFunction() chiama myFun1() e myFun2(), sarÓ necessario eseguire il wrapping ogni chiamata di funzione con una macro LOG per l'output visualizzare quale la chiamata dell'eccezione.

Si potrebbe non desidera utilizzare sempre il LOG macro o anche gli helper LogException(): come indicato. Sono disponibili sia per comoditÓ e come ben come per dimostrare di gestione delle eccezioni completo e per registrare i risultati di qualsiasi eccezione rilevata. Non vengono forniti come il end-all, tutti di essere per la gestione delle eccezioni in ogni ambiente di produzione.

Risoluzione dei problemi

Il codice riportato di seguito viene illustrato come non utilizzare le macro di supporto
    LOGQ( int i = 0; )
    LOGQ( int j = 1 / i; )    // Will this raise a divide by zero?
				
il codice genera un errore del compilatore poichÚ i Ŕ definito solo nell'ambito della prima macro LOGQ. Tenere presente che espande LOGQ:
>
    ...
    try
    {
        int i = 0;
    }
    ...

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

/ W4 e # Import

Se si utilizza il flag/W4 in Visual c ++ e # Import, si noterÓ 8 gli avvisi generati disattivare i file di inclusione che utilizza # import.
comutil.h(905): avviso C4310: cast tronca il valore costante
comutil.h(928): avviso C4310: cast tronca il valore costante
comutil.h(1030): avviso C4310: cast tronca il valore costante
comutil.h(1281): avviso C4310: cast tronca il valore costante
comutil.h(1307): avviso C4310: cast tronca il valore costante
comutil.h(1476): avviso C4310: cast tronca il valore costante
Comdef.h(242): avviso C4244: 'return': conversione da 'int' a 'breve senza segno', Ŕ possibile perdita di dati
Questi messaggi di errore possono essere ignorati e non dovrebbero influenzare il codice.

Per ulteriori informazioni

Il seguente argomento infoviewer di VC ++ 5.0 presentare un'ottima introduzione alla gestione delle tecniche di eccezioni:
Gestione delle eccezioni: Domande frequenti
MK:@IVT:vccore/F26/D2A/S31BE4.HTM

Differenze di gestione delle eccezioni
MK:@IVT:vccore/F26/D2B/S4CC99.HTM
Il seguente articolo vengono illustrate tecniche che Ŕ possono utilizzare per espandere l'esempio EXCEPTEX per gestire le eccezioni SDK di DAO.
152695Come catch e decifrare eccezioni basate sul SDK di DAO
Un'origine definitiva in Win32 Exception Handling Ŕ reperibile:

"Windows avanzate" di Jeffrey Richter, ISBN 1-57231-548-2

ProprietÓ

Identificativo articolo: 167802 - Ultima modifica: venerdý 24 gennaio 2014 - Revisione: 3.2
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi:á
kbnosurvey kbarchive kbmt kbdownload kbdatabase kbfile kbsample KB167802 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 167802
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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