Compartir a través de


Clase CException

La clase base para todas las excepciones en la biblioteca MFC (Microsoft Foundation Class).

Sintaxis

class AFX_NOVTABLE CException : public CObject

Miembros

Constructores públicos

Nombre Descripción
CException::CException Construye un objeto CException.

Métodos públicos

Nombre Descripción
CException::Delete Elimina un objeto CException.
CException::ReportError Notifica un mensaje de error en un cuadro de mensaje al usuario.

Comentarios

Dado que CException es una clase base abstracta no se pueden crear CException objetos directamente; debe crear objetos de clases derivadas. Si necesita crear su propia clase de estilo CException, use una de las clases derivadas mostradas anteriormente como modelo. Asegúrese de que la clase derivada también usa IMPLEMENT_DYNAMIC.

A continuación se enumeran las clases derivadas y sus descripciones:

Nombre Descripción
CSimpleException Una clase base para excepciones MFC de recursos críticos.
CInvalidArgException Condición de excepción de argumento no válida.
CMemoryException Excepción de memoria insuficiente.
CNotSupportedException Solicitud de una operación no admitida.
CArchiveException Excepción específica del archivo.
CFileException Excepción específica del archivo.
CResourceException Recurso de Windows no encontrado o que no se puede crear.
COleException Excepción OLE.
CDBException Excepción de base de datos (es decir, condiciones de excepción que surgen para las clases de base de datos MFC basadas en la conectividad abierta de bases de datos).
COleDispatchException Excepción de envío OLE (automatización).
CUserException Excepción que indica que no se ha podido encontrar un recurso.
CDaoException Excepción de objeto de acceso a datos (es decir, condiciones de excepción que surgen para las clases DAO).
CInternetException Excepción de Internet (es decir, condiciones de excepción que surgen para las clases de Internet).

Estas excepciones están diseñadas para usarse con las macros THROW, THROW_LAST, try, catch, and_catch y end_catch. Para obtener más información sobre las excepciones, vea Procesamiento de excepciones o el artículo Control de excepciones (MFC).

Para detectar una excepción específica, use la clase derivada adecuada. Para detectar todos los tipos de excepciones, use CException y después CObject::IsKindOf para diferenciar entre las clases derivadas de CException. Tenga en cuenta que CObject::IsKindOf solo funciona para las clases declaradas con la macro IMPLEMENT_DYNAMIC, con el fin de aprovechar las ventajas de la comprobación dinámica de tipos. Cualquier clase derivada de CException que cree también debe usar la macro IMPLEMENT_DYNAMIC.

Puede notificar detalles sobre las excepciones al usuario llamando a GetErrorMessage o ReportError, dos funciones miembro que funcionan con cualquiera de las clases derivadas de CException.

Si una de las macros detecta una excepción, el objeto CException se elimina automáticamente; no lo elimine por su cuenta. Si se detecta una excepción mediante una palabra clave catch, no se elimina automáticamente. Vea el artículo Control de excepciones (MFC) para obtener más información sobre cuándo eliminar un objeto de excepción.

Jerarquía de herencia

CObject

CException

Requisitos

Encabezado: afx.h

CException::CException

Esta función miembro construye un objeto CException.

explicit CException(BOOL bAutoDelete);

Parámetros

b_AutoDelete
Especifique TRUE si la memoria del objeto CException se ha asignado en el montón. Esto hará que el objeto CException se elimine cuando se llame a la función miembro Delete para eliminar la excepción. Especifique FALSE si el objeto CException está en la pila o es un objeto global. En este caso, el objeto CException no se eliminará cuando se llame a la función miembro Delete.

Comentarios

Normalmente, nunca tendría que llamar directamente a este constructor. Una función que produce una excepción debe crear una instancia de una clase derivada de CExceptiony llamar a su constructor, o bien usar una de las funciones throw de MFC, como AfxThrowFileException, para iniciar un tipo predefinido. Esta documentación se proporciona solo para completar la información.

CException::Delete

Esta función comprueba si el objeto CException se creó en el montón y, si es así, llama al operador delete en el objeto.

void Delete();

Comentarios

Al eliminar un objeto CException, use la función miembro Delete para eliminar la excepción. No use el operador delete directamente, ya que el objeto CException puede ser un objeto global o se puede haber creado en la pila.

Puede especificar si el objeto se debe eliminar cuando se construye. Para obtener más información, vea CException::CException.

Solo tiene que llamar a Delete si usa el mecanismo de try- catch de C++. Si usa las macros TRY y CATCH de MFC, estas llamarán automáticamente a esta función.

Ejemplo

CFile* pFile = NULL;
// Constructing a CFile object with this override may throw
// a CFile exception, and won't throw any other exceptions.
// Calling CString::Format() may throw a CMemoryException,
// so we have a catch block for such exceptions, too. Any
// other exception types this function throws will be
// routed to the calling function.
// Note that this example performs the same actions as the
// example for CATCH, but uses C++ try/catch syntax instead
// of using the MFC TRY/CATCH macros. This sample must use
// CException::Delete() to delete the exception objects
// before closing the catch block, while the CATCH example
// implicitly performs the deletion via the macros.
try
{
   pFile = new CFile(_T("C:\\WINDOWS\\SYSTEM.INI"),
      CFile::modeRead | CFile::shareDenyNone);
   ULONGLONG ullLength = pFile->GetLength();
   CString str;
   str.Format(_T("Your SYSTEM.INI file is %u bytes long."), ullLength);
   AfxMessageBox(str);
}
catch(CFileException* pEx)
{
   // Simply show an error message to the user.
   pEx->ReportError();
   pEx->Delete();
}
catch(CMemoryException* pEx)
{
   // We can't recover from this memory exception, so we'll
   // just terminate the app without any cleanup. Normally, an
   // an application should do everything it possibly can to
   // clean up properly and _not_ call AfxAbort().
   pEx->Delete();
   AfxAbort();
}
// If an exception occurs in the CFile constructor,
// the language will free the memory allocated by new
// and will not complete the assignment to pFile.
// Thus, our clean-up code needs to test for NULL.
if (pFile != NULL)
{
   pFile->Close();
   delete pFile;
}

CException::ReportError

Llame a esta función miembro para notificar texto de error en un cuadro de mensaje al usuario.

virtual int ReportError(
    UINT nType = MB_OK,
    UINT nMessageID = 0);

Parámetros

nType
Especifica el estilo del cuadro de mensaje. Aplique cualquier combinación de estilos de cuadro de mensaje al cuadro. Si no se especifica este parámetro, el valor predeterminado es MB_OK.

nMessageID
Especifica el id. de recurso (entrada de tabla de cadena) de un mensaje que se va a mostrar si el objeto de excepción no tiene un mensaje de error. Si es 0, se muestra el mensaje "No hay ningún mensaje de error disponible".

Valor devuelto

Es un valor AfxMessageBox; de lo contrario, es 0 si no hay suficiente memoria para mostrar el cuadro de mensaje. Vea AfxMessageBox para obtener los valores de devolución posibles.

Ejemplo

Este es un ejemplo del uso de CException::ReportError. Para obtener otro ejemplo, vea el que hay disponible de CATCH.

CFile fileInput;
CFileException ex;

// try to open a file for reading.
// The file will certainly not
// exist because there are too many explicit
// directories in the name.

// if the call to Open() fails, ex will be
// initialized with exception
// information.  the call to ex.ReportError() will
// display an appropriate
// error message to the user, such as
// "\Too\Many\Bad\Dirs.DAT contains an
// invalid path."  The error message text will be
// appropriate for the
// file name and error condition.

if (!fileInput.Open(_T("\\Too\\Many\\Bad\\Dirs.DAT"), CFile::modeRead, &ex))
{
  ex.ReportError();
}
else
{
  // the file was opened, so do whatever work
  // with fileInput we were planning...

  fileInput.Close();
}

Consulte también

CObject (clase)
Gráfico de jerarquías
Procesamiento de excepciones