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.