/EH (Modelo de control de excepciones)

Actualización: Julio de 2008

Especifica el modelo del control de excepciones que debe utilizar el compilador y destruye los objetos de C++ que estarán fuera de ámbito como resultado de la excepción. Si no se especifica /EH, el compilador capturará las excepciones estructuradas y de C++ pero no destruirá los objetos de C++ que estén fuera de ámbito como resultado de la excepción.

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

Argumentos

  • a
    El modelo de control de excepciones que captura las excepciones asincrónicas (estructuradas) y sincrónicas (de C++).

  • s
    El modelo de control de excepciones que sólo detecta las excepciones de C++ e indica al compilador que asuma que las funciones extern de C sí generan una excepción.

  • c
    Si se utiliza con s (/EHsc), captura sólo las excepciones de C++ e indica al compilador que asuma que las funciones extern de C jamás generan una excepción de C++. /EHca es equivalente a /EHa.

Comentarios

Use /EHs para especificar el modelo de control sincrónico de excepciones (control de excepciones de C++ sin excepciones del control estructurado de excepciones). Si utiliza /EHs, la cláusula catch no detectará excepciones asincrónicas. Además, en Visual C++ 2005, los objetos en el ámbito cuando se genera la excepción asincrónica no se destruirán aun cuando se controle la excepción asincrónica. En /EHs, catch(...) sólo detectará excepciones de C++. Los intentos de acceso no permitidos y las excepciones System.Exception no se detectarán.

Utilice /EHa para especificar el modelo de control de excepciones asincrónicas (control de excepciones de C++ con excepciones del control de excepciones estructurado). /EHa puede dar como resultado una imagen con menor rendimiento debido a que el compilador no optimizará un bloque try con tanto énfasis, ni aunque el compilador no vea un throw.

Utilice /EHa si desea detectar una excepción producida por un método distinto de throw. En el ejemplo siguiente, se genera una excepción:

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

La opción /EHc requiere que se haya especificado /EHs o /EHa. El uso de /clr (Compilación de Common Language Runtime) implica /EHa (/clr /EHa es redundante). El compilador generará un error si se utiliza /EHs[c] detrás de /clr. Las optimizaciones no afectarán a este comportamiento. Cuando se detecta una excepción, el compilador invoca al destructor o a los destructores de clase correspondientes a los objetos que están en el mismo ámbito que la excepción. Si no se detecta ninguna excepción, no se ejecutan estos destructores.

Vea en _set_se_translator las restricciones del control de excepciones en /clr.

La opción puede eliminarse con el símbolo -. Por ejemplo, /EHsc- se interpreta como /EHs /EHc- y es equivalente a /EHs.

Para obtener más información, consulte Exception Handling: Default Synchronous Exception Model.

Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para obtener información detallada, vea Cómo: Abrir páginas de propiedades del proyecto.

  2. Haga clic en la carpeta C/C++.

  3. Haga clic en la página de propiedades Generación de código.

  4. Modifique la propiedad Habilitar excepciones de C++.

Como alternativa, puede utilizar el procedimiento siguiente:

Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio

  1. Haga clic en la carpeta C/C++.

  2. Haga clic en la página de propiedades Generación de código.

  3. Establezca Habilitar excepciones de C++ en No.

  4. Haga clic en la página de propiedades Línea de comandos.

  5. Escriba la opción del compilador en el cuadro Opciones adicionales.

Para establecer esta opción del compilador mediante programación

Vea también

Referencia

Opciones del compilador

Establecer las opciones del compilador

Exception Specifications

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Se ha corregido la descripción de cómo la opción /EHa puede generar una imagen con menor rendimiento. Se ha agregado una declaración final en el bloque try del ejemplo para evitar una optimización no deseada.

Mejora de la información.