Excepciones: Convertir desde macros de excepciones de MFC
Éste es un tema avanzado.
En este artículo se explica cómo convertir el código existente escrito con macros de la clase de la Microsoft foundation class — TRY, CATCH, THROW, etc.) para utilizar las palabras clave try, catch, y throwde control de excepciones de C++. Entre los temas se incluyen los siguientes:
Ventajas de conversión
Convertir código con macros de excepción para utilizar excepciones de C++
Ventajas de convertir
No necesita probablemente convertir código existente, aunque se debe tener en cuenta las diferencias entre las implementaciones de macro en la versión 3.0 de MFC y las implementaciones en versiones anteriores. Estas diferencias y cambios subsiguientes del comportamiento del se tratan en Excepciones: Cambios en las macros de Excepciones en la versión 3.0.
Las ventajas principales de convertir son:
El código que utiliza las palabras clave de control de excepciones de C++ compila un archivo .EXE o un .DLL ligeramente más pequeño.
Las palabras clave de control de excepciones de C++ son más versátiles: Pueden controlar las excepciones de cualquier tipo de datos que se pueden copiar (int, flotante, char, etc.), mientras que las macros controlan excepciones sólo de la clase CException y las clases derivadas de ella.
La diferencia principal entre macros de y las palabras clave es que el código mediante las macros “automáticamente” elimina una excepción detectada cuando la excepción sale del ámbito. El código mediante las palabras clave no lo hace, por lo que debe eliminar explícitamente una excepción detectada. Para obtener más información, vea el artículo Excepciones: Detectando y eliminar Excepciones.
Otra diferencia es sintaxis. La sintaxis para las macros y las palabras clave diferencia en tres aspectos:
Argumentos de macros y declaraciones de excepción:
Una llamada de macro de CATCH tiene la siguiente sintaxis:
Exception_class deCATCH(, *exception_object_pointer_name *###)
Observe la coma entre el nombre de clase y el nombre del puntero de objeto.
La declaración de excepción para la palabra clave de catch utiliza esta sintaxis:
*exception_name *###)de exception_typedecatch(
Esta instrucción de declaración de excepción indica el tipo de excepción el bloque catch.
Delimitador de bloques catch:
Con las macros, la macro de CATCH (con sus argumentos) inicia el primer bloque catch; los bloques catch subsiguientes de comienza de la macro de AND_CATCH , y la macro de END_CATCH finaliza la secuencia de bloques catch.
Con las palabras clave, la palabra clave de catch (con su declaración de excepción) inicia cada bloque catch. No hay equivalente a la macro de END_CATCH ; finaliza el bloque catch con la llave de cierre.
La expresión throw:
Las macros utilizan el re- captura de THROW_LAST la excepción actual. La palabra clave de throw , sin el argumento, tiene el mismo efecto.
Hacer la conversión
Para convertir código mediante macros para utilizar las palabras clave de control de excepciones de C++
Busque todas las apariciones de macros TRY, CATCH, AND_CATCH, END_CATCH, THROW, y THROW_LASTMFC.
Reemplace o elimine todas las apariciones de macros siguientes:
TRY (Sustitúyalo por try)
CATCH (Sustitúyalo por catch)
AND_CATCH (sustitúyalo por catch)
END_CATCH (Suprimir él)
THROW (Sustitúyalo por throw)
THROW_LAST (sustitúyalo por throw)
Modifique los argumentos de macros de modo que constituyen declaraciones válidas de la excepción.
Por ejemplo, cambie
CATCH(CException, e)
por
catch(CException* e)
Modifique el código de los bloques catch de para que quite objetos de excepción según sea necesario. Para obtener más información, vea el artículo Excepciones: Detectando y eliminar Excepciones.
A continuación se muestra un ejemplo del código de control de excepciones con macros de excepción de MFC. Dado que el código del ejemplo siguiente utiliza las macros, la excepción e se elimina automáticamente:
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e)
{
if (m_bPassExceptionsUp)
THROW_LAST();
if (m_bReturnFromThisFunction)
return;
// Not necessary to delete the exception e.
}
END_CATCH
El código del ejemplo siguiente utiliza las palabras clave de excepciones de C++, por lo que la excepción debe explícitamente eliminarse:
try
{
// Do something to throw an exception.
AfxThrowUserException();
}
catch(CException* e)
{
if (m_bPassExceptionsUp)
throw;
if (m_bThrowDifferentException)
{
e->Delete();
throw new CMyOtherException;
}
if (m_bReturnFromThisFunction)
{
e->Delete();
return;
}
e->Delete();
}
Para obtener más información, vea Excepciones: Utilizando las macros y C++ Excepciones de MFC.