Partager via


/EH (Modèle de gestion des exceptions)

Spécifie le modèle de gestion des exceptions à utiliser par le compilateur et détruit les objets C++ qui sont hors de portée suite à l'exception. Si /EH n'est pas spécifié, le compilateur intercepte les exceptions structurées et C++, mais ne détruit pas les objets C++ qui sont hors de portée suite à l'exception.

/EH{s|a}[c][-]

Arguments

  • a
    Modèle de gestion des exceptions qui intercepte les exceptions asynchrones (structurées) et synchrones (C++).

  • s
    Modèle de gestion des exceptions qui intercepte uniquement les exceptions C++ et indique au compilateur de présumer que les fonctions C de type extern lèvent une exception.

  • c
    Si utilisé avec s (/EHsc), il intercepte uniquement les exceptions C++ et indique au compilateur de supposer que les fonctions extern C ne lèvent jamais une exception C++. /EHca équivaut à /EHa.

Notes

Utilisez /EHs pour spécifier le modèle de gestion synchrone des exceptions (gestion des exceptions C++ sans exceptions de gestion structurée des exceptions). Si vous utilisez /EHs, votre clause catch n'interceptera pas les exceptions asynchrones. Qui plus est, tous les objets compris dans la portée au moment de la génération de l'exception asynchrone ne sont pas détruits, même si l'exception asynchrone est gérée. Sous /EHs, catch(...) intercepte uniquement les exceptions C++. Les violations d'accès et les exceptions System.Exception ne sont pas interceptées.

Utilisez /EHa pour spécifier le modèle de gestion asynchrone des exceptions (gestion des exceptions C++ avec exceptions de gestion structurée des exceptions). /EHa peut résulter en une image un peu moins performante car le compilateur n'optimisera pas le bloc de manière agressive try, même si le compilateur ne détecte pas de clause throw.

Utilisez /EHa si vous souhaitez intercepter une exception levée avec autre chose qu'une clause throw. L'exemple suivant génère une exception :

// 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;
   }
}

L'option /EHc exige la spécification de /EHs ou de /EHa. /clr (Compilation pour le Common Language Runtime) implique /EHa (/clr /EHa est redondant). Le compilateur génère une erreur si /EHs[c] est utilisé après /clr. Les optimisations n'affectent pas ce comportement. Lorsqu'une exception est interceptée, le compilateur appelle le ou les destructeurs de classe pour le ou les objets compris dans la même portée que l'exception. Lorsqu'une exception n'est pas interceptée, ces destructeurs ne sont pas exécutés.

Pour connaître les restrictions relatives à la gestion des exceptions sous /clr, consultez _set_se_translator.

Cette option peut être annulée avec le symbole -. Par exemple, /EHsc- est interprété en tant que /EHs /EHc- et équivaut à /EHs.

Consultez Exception Handling: Default Synchronous Exception Model pour plus d'informations.

Pour définir cette option du compilateur dans l'environnement de développement Visual Studio

  1. Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d'informations, consultez Comment : ouvrir les pages de propriétés d'un projet.

  2. Cliquez sur le dossier C/C++.

  3. Cliquez sur la page de propriétés Génération de code.

  4. Modifiez la propriété Activation des exceptions C++.

Vous pouvez également procéder comme suit :

Pour définir cette option du compilateur dans l'environnement de développement Visual Studio

  1. Cliquez sur le dossier C/C++.

  2. Cliquez sur la page de propriétés Génération de code.

  3. Attribuez à la propriété Activation des exceptions C++ la valeur Non.

  4. Cliquez sur la page de propriétés Ligne de commande.

  5. Spécifiez l'option du compilateur dans la zone Options supplémentaires.

Pour définir cette option du compilateur par programme

Voir aussi

Référence

Options du compilateur

Définition des options du compilateur

Exception Specifications