Domanda

Se Sto creando un nuovo progetto in unmanaged C ++, Visual Studio 2008 o superiore, che la gestione delle eccezioni modello voglio andare con?

Capisco che / EHA opzione risultati in codice meno efficiente, e le catture anche delle eccezioni SEH, giusto?

(...) i gestori di sterzo chiaro di tale facoltà e tipicamente andare con / EHsc, in modo che io sto solo la cattura di eccezioni C ++ che sono in realtà gettati e non cattura le violazioni di accesso e altri execptions strutturati, in cattura così mi è stato . Se v'è una violazione di accesso nel mio codice, non voglio che venga mascherato da una catch (...) {}.

codice che ho con gli altri che vogliono catch (...) {} di non fare nulla e hanno anche lo vogliono per farlo se non v'è una violazione di accesso, che sembra una pessima idea per me. Se c'è un bug a causa di codifica male, non si vuole posizionare le dita nelle orecchie e ad alta voce dire "La la la la la!" in modo che non c'è bisogno di avere il crash del programma? Infatti, se il codice è ora in cattivo stato a causa di un errore di codifica, non si vuole veramente il codice di continuare?

Quindi il mio pensiero generale è che / EHA crea grande codice / lento e permette ai programmatori di ottenere via con la scrittura di codice che, se un bug fatale è presente, continuerà a funzionare in uno stato indefinito.

A proposito, sto parlando di applicazioni e codice di servizio che è quello che stiamo scrivendo per la maggior parte. Non a basso livello di driver di periferica o qualcosa di simile.

Si prega di pesare in con i vostri pensieri.

È stato utile?

Soluzione

/ EHA fa due cose. In primo luogo, sopprime un'ottimizzazione che omette i filtri di eccezione che chiamano automaticamente i distruttori di variabili di classe locali se l'analizzatore di codice non può vedere alcun codice che potrebbe un'eccezione C ++. Questo rende pila svolgimento sicuro per ogni tipo di eccezione, non solo un'eccezione C ++. Overhead per questi filtri eccezione è il tempo e lo spazio su x86 sia su x86 e x64.

E sì, si altera il comportamento di cattura (...), ora filtra anche alcuna eccezione SEH, non solo C ++. Questo è davvero un gioco d'azzardo, perché si cattura tutta la roba davvero brutto, le eccezioni hardware asincroni. Anche se io personalmente non credo che cattura tutte le eccezioni C ++ è molto difendibile sia, avete ancora, ma una vaga idea fino a che punto lo stato del programma ottenuto mutato e perché non è riuscito.

Realisticamente, avrete bisogno di passare ad usare __try/__except modo che si può scrivere il proprio filtro di eccezione e di evitare la cattura i cattivi. Il codice di eccezione per eccezioni C ++ è 0xe04d5343 ( "MSC"). Utilizzando _set_se_translator () sarebbe un altro approccio.

Altri suggerimenti

Io uso / EHA perché è sicuro con .NET interoperabilità, mentre / EHsc potrebbe non essere; vedi non chiamato quando nativo (C ++) eccezione propaga a CLR componente per esempio.

Tuttavia, se per un po 'di codice specifico della performance migliore conta davvero e non hai bisogno di .NET (o qualsiasi altra cosa) compatibilità, poi certo, / EHsc suona bene.

Né / EHsc né / EHA cattura più errori di memoria, in modo da utilizzare questi per le violazioni di accesso di cattura è un caso senza speranza.

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