Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se describen las consideraciones para escribir código que usa 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 temas siguientes:
Combinación de palabras clave y macros de excepción
Puede mezclar macros de excepciones de MFC y palabras clave de excepción de C++ en el mismo programa. Pero no se pueden mezclar macros de MFC con palabras clave de excepción de C++ en el mismo bloque porque las macros eliminan automáticamente los objetos de excepción cuando salen del ámbito, mientras que el código que usa las palabras clave de control de excepciones no. Para obtener más información, consulte el artículo Excepciones: Detectar y eliminar excepciones.
La principal diferencia entre las macros y las palabras clave es que las macros "automáticamente" eliminan una excepción detectada cuando la excepción sale del ámbito. El código que usa las palabras clave no lo hace; Las excepciones detectadas en un bloque catch deben eliminarse explícitamente. La combinación de macros y palabras clave de excepción de C++ puede provocar pérdidas de memoria cuando no se elimina un objeto de excepción o daños en el montón cuando se elimina una excepción dos veces.
El código siguiente, por ejemplo, invalida el puntero de 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 e
se elimina cuando la ejecución pasa del bloque CATCH "interno". El uso de la macro THROW_LAST en lugar de la instrucción THROW hará que el bloque CATCH "externo" reciba 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
Probar bloques dentro de bloques catch
No se puede volver a iniciar la excepción actual desde dentro de un try
bloque que está dentro de un bloque 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: Examinar el contenido de la excepción.