Compartir a través de


Excepciones: Usar macros de MFC y excepciones de C++

Este artículo trata sobre las consideraciones para escribir código que utilice las macros de control de excepciones de MFC y las palabras clave de control de excepciones de C++.

En este artículo se tratan los siguientes temas:

  • Mezclar palabras clave y macros de excepción

  • Bloque Try dentro de los bloques catch

Mezclar las palabras clave y macros de Excepciones

Puede mezclar palabras clave de las macros de excepción de MFC y de excepciones de C++ en el mismo programa. Pero no puede mezclar las macros MFC con palabras clave de excepciones de C++ en el mismo bloque porque macros eliminan objetos de excepción automáticamente cuando salen del ámbito, aunque no hace el código mediante las palabras clave excepción- que administran. Para obtener más información, vea el artículo Excepciones: Detectando y eliminar Excepciones.

La diferencia principal entre macros de y las palabras clave es que las macros “automáticamente” cancelar una excepción detectada cuando la excepción sale del ámbito. El código mediante las palabras clave no tiene; las excepciones detectadas en un bloque catch deben en se eliminarán. Mezclar palabras clave de macros y de excepciones de C++ puede provocar pérdidas de memoria cuando un objeto de excepción no se elimina, o daños en la pila cuando una excepción se elimina dos veces.

El código siguiente, por ejemplo, reemplaza el puntero de la excepción:

TRY
{
   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH(CException, e)  // The "inner" catch block
   {
      throw;  // Invalid attempt to throw exception 
            // to the outer catch block below.
   }
   END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
    // Pointer e is invalid because 
    // it was deleted in the inner catch block.
}
END_CATCH

El problema se produce porque se elimina e cuando la ejecución del bloque “interno” de CATCH . Mediante la macro de THROW_LAST en lugar de la instrucción de THROW hará el bloque “externo” de CATCH para recibir un puntero válido:

TRY
{
   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH(CException, e)  // The "inner" catch block
   {
      THROW_LAST(); // Throw exception to the outer catch block below.
   }
   END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
    // Pointer e is valid because 
    // THROW_LAST() was used.
}
END_CATCH

Bloque Try dentro de los bloques Catch

No puede re- captura la excepción actual dentro de try bloqueado que está dentro de un bloque de CATCH . El ejemplo siguiente no es válido:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   try
   {
      throw;  // Wrong.  Causes e (the exception  
            // being thrown) to be deleted.
   }
   catch(CException* exception)
   {
      exception->ReportError();
   }
}
END_CATCH

Para obtener más información, vea Excepciones: Contenido de inspección de excepción.

Vea también

Conceptos

Control de excepciones en MFC