Condividi tramite


/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

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Procedura: aprire le pagine delle proprietà dei progetti.

  2. Nel riquadro sinistro espandere Proprietà di configurazione, C/C++, Generazione codice.

  3. 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 anche

Riferimenti

Opzioni del compilatore

Impostazione delle opzioni del compilatore

Specifiche di eccezioni

Gestione strutturata delle eccezioni (C/C++)

Concetti

Gestione di errori ed eccezioni (C++ moderno)