/EH (Modello di gestione delle eccezioni)
Specifica il tipo di gestione delle eccezioni che dovrà essere utilizzato dal compilatore ed elimina gli oggetti C++ che non rientrano nell'ambito in seguito a un'eccezione. Se l'opzione /EH non viene specificata, il compilatore intercetta sia le eccezioni strutturate asincrone sia le eccezioni C++, ma non elimina gli oggetti C++ che non rientrano nell'ambito in seguito a un'eccezione asincrona.
/EH{s|a}[c][-]
Argomenti
a
Modello di gestione delle eccezioni che intercetta sia le eccezioni asincrone (strutturate) sia le eccezioni sincrone (C++).s
Modello di gestione delle eccezioni che intercetta solo le eccezioni C++ e indica al compilatore di supporre che le funzioni dichiarate come extern "C" potrebbero generare un'eccezione.c
Se utilizzato con s (/EHsc), intercetta solo le eccezioni C++ e indica al compilatore di supporre che le funzioni dichiarate come extern "C" non generano mai un'eccezione C++./EHca è equivalente a /EHa.
Note
L'opzione del compilatore /EHa viene utilizzata per supportare la gestione delle eccezioni strutturate asincrone (SEH) con la clausola catch(...) C++ nativa. Per implementare SEH senza specificare /EHa, è possibile utilizzare la sintassi __try, __except e __finally. Sebbene Windows e Visual C++ supportino SEH, è vivamente consigliabile utilizzare la gestione delle eccezioni C++ conforme allo standard ISO (/EHs o /EHsc) in quanto rende il codice più portabile e flessibile. Tuttavia, nel codice esistente o per alcuni tipi di programmi, ad esempio nel codice compilato per supportare Common Language Runtime (/clr (Compilazione Common Language Runtime)), potrebbe ancora essere necessario utilizzare SEH. Per ulteriori informazioni, vedere Gestione strutturata delle eccezioni (C/C++).
L'utilizzo di /EHa e il tentativo di gestire tutte le eccezioni tramite catch(...) potrebbero comportare dei rischi. Nella maggior parte dei casi, le eccezioni asincrone sono irreversibili e devono essere gestite come tali. Il tentativo di intercettarle per procedere potrebbe causare il danneggiamento del processo ed errori difficili da trovare e risolvere.
Se si utilizza /EHs o /EHsc, la clausola catch(...) non intercetta le eccezioni strutturate asincrone. Le violazioni di accesso e le eccezioni Exception gestite non vengono intercettate e gli oggetti che rientrano nell'ambito quando viene generata un'eccezione asincrona non vengono eliminati anche se l'eccezione asincrona viene gestita.
Se si utilizza /EHa, l'immagine potrebbe risultare di dimensioni maggiori e le sue prestazioni potrebbero non essere ottimali perché il compilatore non ottimizza un blocco try in modo così aggressivo e lascia filtri di eccezioni che chiamano automaticamente i distruttori di tutti gli oggetti locali anche se il compilatore non visualizza alcun codice che possa generare un'eccezione C++. In questo modo, è possibile procedere in modo sicuro alla rimozione dello stack per le eccezioni asincrone e per le eccezioni C++. Quando si utilizza /EHs, il compilatore presuppone che le eccezioni possano verificarsi solo in corrispondenza di un'istruzione throw o di una chiamata di funzione. In questo modo, il compilatore elimina il codice per tenere traccia della durata di molti oggetti non rimovibili, con conseguente riduzione significativa delle dimensioni del codice.
È consigliabile non collegare gli oggetti compilati tramite /EHa a quelli compilati tramite /EHs nello stesso modulo eseguibile. Se è necessario gestire un'eccezione asincrona tramite /EHa in qualsiasi punto del modulo, utilizzare /EHa per compilare tutto il codice nel modulo. È possibile utilizzare la sintassi di gestione delle eccezioni strutturate nello stesso modulo del codice compilato tramite /EHs, ma non è possibile combinare la sintassi SEH con try, throw e catch nella stessa funzione.
Utilizzare /EHa se si desidera intercettare un'eccezione generata da istruzioni diverse da throw. In questo esempio viene generata e intercettata un'eccezione strutturata:
// compiler_options_EHA.cpp
// compile with: /EHa
#include <iostream>
#include <excpt.h>
using namespace std;
void fail() { // generates SE and attempts to catch it using catch(...)
try {
int i = 0, j = 1;
j /= i; // This will throw a SE (divide by zero).
printf("%d", j);
}
catch(...) { // catch block will only be executed under /EHa
cout<<"Caught an exception in catch(...)."<<endl;
}
}
int main() {
__try {
fail();
}
// __except will only catch an exception here
__except(EXCEPTION_EXECUTE_HANDLER) {
// if the exception was not caught by the catch(...) inside fail()
cout << "An exception was caught in __except." << endl;
}
}
Per l'opzione /EHc è necessario specificare /EHs o /EHa. L'utilizzo di /clr implica /EHa (ovvero /clr /EHa è ridondante). Il compilatore genera un errore se /EHs[c] viene utilizzato dopo /clr. Le ottimizzazioni non influiscono su questo comportamento. Quando viene intercettata un'eccezione, il compilatore richiama il distruttore o i distruttori di classe per l'oggetto o gli oggetti che rientrano nello stesso ambito dell'eccezione. Quando un'eccezione non viene intercettata, questi distruttori non vengono eseguiti.
Per informazioni sulle restrizioni relative alla gestione delle eccezioni in /clr, vedere _set_se_translator.
L'opzione può essere cancellata utilizzando il simbolo -. Ad esempio, /EHsc- viene interpretato come /EHs /EHc- ed equivale a /EHs.
Per impostare l'opzione del compilatore nell'ambiente di sviluppo di Visual Studio
Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Procedura: aprire le pagine delle proprietà dei progetti.
Nel riquadro sinistro espandere Proprietà di configurazione, C/C++, Generazione codice.
Modificare la proprietà Abilita eccezioni C++.
In alternativa, impostare Abilita eccezioni C++ su No, quindi nella casella Opzioni aggiuntive della pagina delle proprietà Riga di comando aggiungere l'opzione del compilatore.
Per impostare l'opzione del compilatore a livello di codice
- Vedere ExceptionHandling.
Vedere anche
Riferimenti
Impostazione delle opzioni del compilatore
Gestione strutturata delle eccezioni (C/C++)