Domanda

Quali punti importanti sulle eccezioni strutturati dovrebbe ogni C ++ conoscenze sviluppatore?

È stato utile?

Soluzione

Sono Win32 equivalenti ai segnali Unix, e lasciate che si cattura CPU eccezioni come violazione di accesso, l'istruzione illegale, divisione per zero.

Con le opzioni del compilatore di destra (/ EHA per Visual C ++), eccezioni C ++ utilizzano lo stesso meccanismo di stack svolgimento lavori correttamente sia per il C ++ (utente) eccezioni e SEH eccezioni (OS).

A differenza di eccezioni C ++, SEH non sono digitato, ma tutti condividono la stessa struttura di dati che ha un codice di eccezione (la causa) e ulteriori informazioni su quale codice ineccepibili e quali sono i registri della CPU possedute al momento del guasto. Vedere GetExceptionCode e GetExceptionInformation per maggiori dettagli su questo.

Inoltre, SEH ha "first-chance" gestione, che permette di accedere o gestire l'eccezione prima di svolgimento distrugge tutte le variabili locali.

Altri suggerimenti

Recentemente ho avuto un problema che è stato causato indirettamente da SEH, in particolare a causa di una caratteristica di SEH che penso che ogni sviluppatore dovrebbe essere a conoscenza di:

distruttori Quando si usa SEH non sono chiamati, quindi se avete il codice di pulitura nel vostro distruttore non sarà ripulita.

Il nostro problema è stato causato da una sezione critica che è stata avvolta da un oggetto con bloccaggio nel costruttore e sbloccare nel distruttore.

Abbiamo avuto una situazione di stallo e non riusciva a capire perché, e dopo circa una settimana di scavare attraverso il codice e discariche e il debug abbiamo capito che era perché c'era un'eccezione che è stata gestita da COM e causando la sezione critica per rimanere bloccato. Abbiamo cambiato un flag di compilazione in VS nelle proprietà del progetto che raccontano per eseguire i distruttori anche per SEH e che ha risolto il problema.

Quindi, anche se non è possibile utilizzare SEH nel codice, si può utilizzare una libreria che fa (come COM) e che può causare un comportamento imprevisto.

Si dovrebbe sapere che non fanno parte di standard C ++ -. Sono Microsoft invenzione e possono essere utilizzati in lingue diverse dal C ++

un corso intensivo sulle profondità della Win32 ™ eccezioni strutturata Gestione

Questo articolo è il di riferimento su come ottenere fino a velocità con SEH. 13 anni dopo, è ancora il migliore che ci sia.

C'è un argomento dedicato su MSDN per SEH vs. C ++ Exception Handling differenze .

Alcune cose uno sviluppatore C ++ dovrebbe conoscere se SEH è in discussione:

La scrittura C / C ++ SEH eccezione Handlers :

__try 
{
   // guarded code
}
__except ( expression )
{
   // exception handler code
}

Questo è non C ++ gestione delle eccezioni, è estensioni specifiche MS per collegare direttamente inot SEH. Funziona in modo molto diverso dai tuoi run-of-the-mill C ++ eccezioni. Avete bisogno di una buona comprensione di SEH di utilizzare questi.

La scrittura C / C ++ SEH terminazione Handlers :

__try {
   // guarded code
}
__finally ( expression ) {
   // termination code
}

Lo stesso con il gestore SEH, non confondere questo con C ++ la semantica di eccezione. Avete bisogno di una buona comprensione di SEH.

_set_se_trasnlator : questo è il funzione che traduce eccezioni SEH in C ++ eccezioni tipo se si utilizzano le eccezioni asincrone / EHA .

E, infine, un parere personale: dovrebbe know SEH C ++ sviluppatore? Dopo il primo rookie .ecxr capirete che quando la spinta viene a spingere eccezioni C ++ sono solo un'illusione previsto per la vostra convenienza. L'unica cosa che sta succedendo è SEH.

Un punto importante è sapere quando usare SEH e quando utilizzare eccezioni standard C ++. In primo luogo, scegliere un solo sistema - sistemi di miscelazione tende ad essere problematico, che richiede una conoscenza approfondita sia per attuare bene. In secondo luogo, a un livello elevato, SEH non si limita a C ++, mentre eccezioni standard C ++ non si limitano a Windows. Se questo non dettare la vostra decisione, scegliere eccezioni standard a meno che non siano inadeguati (vedi le altre risposte per maggiori dettagli su ciò che può fare SEH).

Una citazione da la documentazione di Microsoft (datata 2018/08/13) supporta questa conclusione.

  

la gestione delle eccezioni strutturata (SEH) è un'estensione Microsoft di C per gestire certe situazioni codice eccezionali, come guasti hardware, con grazia. Sebbene Windows e Microsoft C ++ SEH supporto, si consiglia di utilizzare C ++ standard ISO gestione delle eccezioni, perché rende il codice più portabile e flessibile. Tuttavia, per mantenere il codice o per particolari tipi di programmi esistenti, è ancora potrebbe essere necessario utilizzare SEH.

Perché l'autore di un'estensione consiglio non può essere utilizzato nella maggior parte dei casi? Presumibilmente perché l'estensione è stato scritto per C e il contesto attuale è C ++. Le lingue sono simili, così porting SEH al C ++ come un beneficio collaterale è stato probabilmente abbastanza facile, anche se solo "particolari tipi di programmi" sarebbe davvero beneficio. (o forse qualche altra ragione,.. Forse il porting è stato avviato prima di C ++ è stato standardizzato Storia ottiene contorto)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top