Excepciones: Detectar y eliminar excepciones
En las instrucciones y ejemplos siguientes se muestra cómo detectar y eliminar excepciones. Para obtener más información sobre las palabras clave try
, catch
y throw
, vea Procedimientos recomendados de C++ moderno para las excepciones y el control de errores.
Los controladores de excepciones deben eliminar los objetos de excepción que controlan, ya que si no se elimina la excepción, se produce una fuga de memoria cada vez que ese código detecta una excepción.
El bloque catch
debe eliminar una excepción cuando:
El bloque
catch
produce una nueva excepción.Por supuesto, no debe eliminar la excepción si vuelve a producir la misma excepción:
catch (CException* e) { if (m_bThrowExceptionAgain) throw; // Do not delete e else e->Delete(); }
La ejecución regresa desde dentro del bloque
catch
.
Nota:
Al eliminar un CException
, use la función miembro Delete
para eliminar la excepción. No use la palabra clave delete
, ya que puede producir un error si la excepción no está en el montón.
Filtrar y eliminar excepciones
Use la palabra clave
try
para configurar un bloquetry
. Ejecute cualquier instrucción de programa que pueda producir una excepción dentro de un bloquetry
.Use la palabra clave
catch
para configurar un bloquecatch
. Coloque el código de control de excepciones en un bloquecatch
. El código del bloquecatch
solo se ejecuta si el código del bloquetry
produce una excepción del tipo especificado en la instruccióncatch
.El esqueleto siguiente muestra cómo los bloques
try
ycatch
se organizan normalmente:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CException* e) { // Handle the exception here. // "e" contains information about the exception. e->Delete(); }
Cuando se produce una excepción, el control pasa al primer bloque
catch
cuya declaración de excepción coincide con el tipo de la excepción. Puede controlar de forma selectiva diferentes tipos de excepciones con bloquescatch
secuenciales, como se muestra a continuación:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CMemoryException* e) { // Handle the out-of-memory exception here. e->Delete(); } catch (CFileException* e) { // Handle the file exceptions here. e->Delete(); } catch (CException* e) { // Handle all other types of exceptions here. e->Delete(); }
Para obtener más información, consulte Excepciones: Convertir desde macros de excepciones de MFC.