Control de excepciones en MFC

En este artículo se explican los mecanismos de control de excepciones disponibles en MFC. Hay dos mecanismos disponibles:

  • Excepciones de C++, disponibles en MFC versión 3.0 y posteriores

  • Macros de excepción de MFC, disponibles en MFC 1.0 y posteriores

Si va a escribir una nueva aplicación mediante MFC, debe usar el mecanismo de C++. Puede usar el mecanismo basado en macros si la aplicación existente ya usa ese mecanismo ampliamente.

Puede convertir fácilmente el código existente para usar excepciones de C++ en lugar de las macros de excepción de MFC. Las ventajas de convertir el código y las instrucciones para hacerlo se describen en el artículo Excepciones: conversión de macros de excepción de MFC.

Si ya ha desarrollado una aplicación con las macros de excepción de MFC, puede seguir usando estas macros en el código existente, mientras usa excepciones de C++ en el nuevo código. En el artículo Excepciones: cambios en las macros de excepción de la versión 3.0 se proporcionan instrucciones para hacerlo.

Nota:

Para habilitar el control de excepciones de C++ en el código, seleccione Habilitar excepciones de C++ en la página Generación de código de la carpeta C/C++ del cuadro de diálogo Páginas de propiedades del proyecto o use la opción del compilador /EHsc.

En este artículo se tratan los temas siguientes:

Cuándo se usan las excepciones

Se pueden producir tres categorías de resultados cuando se llama a una función durante la ejecución del programa: ejecución normal, ejecución errónea o ejecución anómala. A continuación, se describen las categorías.

  • Ejecución normal

    La función se puede ejecutar y devolver normalmente. Algunas funciones devuelven un código de resultado al autor de la llamada, que indica el resultado de la función. Los códigos de resultado posibles se definen estrictamente para la función y representan el intervalo de resultados posibles de la función. El código de resultado puede indicar éxito o error, o incluso puede indicar un tipo determinado de error que se encuentra dentro del intervalo normal de expectativas. Por ejemplo, una función de estado de archivo puede devolver un código que indique que el archivo no existe. Tenga en cuenta que no se usa el término "código de error" porque un código de resultado representa uno de los muchos resultados esperados.

  • Ejecución errónea

    El autor de la llamada comete algún error al pasar argumentos a la función o llama a la función en un contexto inadecuado. Esta situación produce un error y se debe detectar mediante una aserción durante el desarrollo del programa. (Para obtener más información sobre las aserciones, vea Aserciones de C/C++).

  • Ejecución anómala

    La ejecución anómala incluye situaciones en las que las condiciones fuera del control del programa, como errores de poca memoria o de E/S, influyen en el resultado de la función. Las situaciones anómalas se deben controlar detectando e iniciando excepciones.

El uso de excepciones es especialmente adecuado para la ejecución anómala.

Compatibilidad de las excepciones de MFC

Tanto si usa las excepciones de C++ directamente como si usa las macros de excepción de MFC, usará la clase CException o los objetos derivados de CException que el marco o la aplicación puedan iniciar.

En la tabla siguiente se muestran las excepciones predefinidas proporcionadas por MFC.

Exception (clase) Significado
CMemoryException (clase) Sin memoria
CFileException (clase) Excepción de archivo
CArchiveException (clase) Excepción de archivo o serialización
CNotSupportedException (clase) Respuesta a la solicitud de servicio no admitido
CResourceException (clase) Excepción de asignación de recursos de Windows
CDaoException (clase) Excepciones de base de datos (clases DAO)
CDBException (clase) Excepciones de base de datos (clases ODBC)
COleException (clase) excepciones OLE
COleDispatchException (clase) Excepciones de envío (automatización)
CUserException (clase) Excepción que alerta al usuario con un cuadro de mensaje y, a continuación, inicia una clase CException genérica.

Desde la versión 3.0, MFC ha utilizado las excepciones de C++ pero sigue admitiendo sus anteriores macros de control de excepciones, que son similares a las excepciones de C++ en su forma. Aunque estas macros no son recomendables para nueva programación, todavía se siguen admitiendo por razones de compatibilidad con versiones anteriores. En los programas que ya utilizan las macros, también puede utilizar libremente las excepciones de C++. Durante el preprocesamiento, las macros evalúan las palabras clave de control de excepciones definidas en la implementación MSVC del lenguaje C++ a partir de Visual C++ versión 2.0. Puede dejar las macros de excepciones existentes en su sitio mientras empieza a utilizar las excepciones de C++. Para obtener información sobre cómo combinar macros y el control de excepciones de C++, y cómo convertir código anterior para usar el nuevo mecanismo, vea los artículos Excepciones: uso de macros de MFC y excepciones de C++ y Excepciones: conversión de macros de excepciones de MFC. Las macros de excepciones de MFC anteriores, si todavía las utiliza, se evalúan como palabras clave de excepciones de C++. Vea Excepciones: cambios en las macros de excepciones en la versión 3.0. MFC no admite directamente controladores de excepciones estructurados (SEH) de Windows NT, como se describe en Control de excepciones estructurado.

Más información sobre las excepciones

En los artículos siguientes se explica el uso de la biblioteca de MFC para el control de excepciones:

En los artículos siguientes se comparan las macros de excepción de MFC con las palabras clave de excepción de C++ y se explica cómo puede adaptar el código:

Consulte también

Procedimientos recomendados de C++ moderno para las excepciones y el control de errores