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

  1. Use la palabra clave try para configurar un bloque try. Ejecute cualquier instrucción de programa que pueda producir una excepción dentro de un bloque try.

    Use la palabra clave catch para configurar un bloque catch. Coloque el código de control de excepciones en un bloque catch. El código del bloque catch solo se ejecuta si el código del bloque try produce una excepción del tipo especificado en la instrucción catch.

    El esqueleto siguiente muestra cómo los bloques try y catch 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 bloques catch 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.

Consulte también

Control de excepciones