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.
Se trata de un tema avanzado.
En este artículo se explica cómo convertir código existente escrito con macros de Microsoft Foundation Class ( TRY, CATCH, THROW, etc.) para usar las palabras clave try
de control de excepciones de C++ , catch
y throw
. Contenido de los temas:
Ventajas de la conversión
Probablemente no necesite convertir código existente, aunque debe tener en cuenta las diferencias entre las implementaciones de macros en la versión 3.0 de MFC y las implementaciones de versiones anteriores. Estas diferencias y los cambios posteriores en el comportamiento del código se describen en Excepciones: Cambios en macros de excepción en la versión 3.0.
Las principales ventajas de la conversión son:
El código que usa las palabras clave de control de excepciones de C++ se compila en un .EXE o .DLL ligeramente más pequeños.
Las palabras clave de control de excepciones de C++ son más versátiles: pueden controlar excepciones de cualquier tipo de datos que se pueda copiar (
int
,float
,char
etc.), mientras que las macros solo controlan excepciones de clasesCException
y clases derivadas de él.
La principal diferencia entre las macros y las palabras clave es que el código que usa las macros "automáticamente" elimina una excepción detectada cuando la excepción sale del ámbito. El código que usa las palabras clave no lo hace, por lo que debe eliminar explícitamente una excepción detectada. Para obtener más información, consulte el artículo Excepciones: Detectar y eliminar excepciones.
Otra diferencia es la sintaxis. La sintaxis de macros y palabras clave difiere en tres aspectos:
Argumentos de macro y declaraciones de excepciones:
Una invocación de macro CATCH tiene la siguiente sintaxis:
CATCH(exception_class, 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 de la
catch
palabra clave usa esta sintaxis:catch(exception_typeexception_name)
Esta instrucción de declaración de excepción indica el tipo de excepción que controla el bloque catch.
Delimitación de bloques catch:
Con las macros, la macro CATCH (con sus argumentos) comienza el primer bloque catch; la macro AND_CATCH comienza los siguientes bloques catch y la macro END_CATCH finaliza la secuencia de bloques catch.
Con las palabras clave, la
catch
palabra clave (con su declaración de excepción) comienza cada bloque catch. No hay ningún homólogo en la macro de END_CATCH ; El bloque catch termina con su llave de cierre.La expresión throw:
Las macros usan THROW_LAST para volver a iniciar la excepción actual. La
throw
palabra clave, sin argumento, tiene el mismo efecto.
Realizar la conversión
Para convertir código mediante macros para usar las palabras clave de control de excepciones de C++
Busque todas las apariciones de las macros MFC TRY, CATCH, AND_CATCH, END_CATCH, THROW y THROW_LAST.
Reemplace o elimine todas las apariciones de las macros siguientes:
TRY (Reemplácelo por
try
)CATCH (Reemplácelo por
catch
)AND_CATCH (reemplácelo por
catch
)END_CATCH (eliminarlo)
THROW (Reemplácelo por
throw
)THROW_LAST (reemplácelo por
throw
)Modifique los argumentos de macro para que foren declaraciones de excepción válidas.
Por ejemplo, cambie
CATCH(CException, e)
Para
catch (CException* e)
Modifique el código de los bloques catch para que elimine los objetos de excepción según sea necesario. Para obtener más información, consulte el artículo Excepciones: Detectar y eliminar excepciones.
Este es un ejemplo de código de control de excepciones mediante macros de excepción de MFC. Tenga en cuenta que, dado que el código del ejemplo siguiente usa 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 usa las palabras clave de excepción de C++, por lo que la excepción debe eliminarse explícitamente:
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: Uso de macros de MFC y excepciones de C++.