Compartir a través de


Excepciones: Iniciar excepciones desde sus propias funciones

Es posible usar el paradigma de control de excepciones de MFC únicamente para detectar excepciones generadas por funciones en MFC u otras bibliotecas. Además de detectar excepciones generadas por código de biblioteca, puede generar excepciones desde su propio código si escribe funciones que pueden encontrarse con condiciones excepcionales.

Cuando se genera una excepción, se detiene la ejecución de la función actual y pasa directamente al bloque catch del marco de excepción más interna. El mecanismo de excepción omite la ruta de acceso de salida normal de una función. Por lo tanto, debe asegurarse de eliminar los bloques de memoria que se eliminarían en una salida normal.

Para generar una excepción

  1. Use una de las funciones auxiliares de MFC, como AfxThrowMemoryException. Estas funciones generan un objeto de excepción asignado previamente del tipo adecuado.

    En el ejemplo siguiente, una función intenta asignar dos bloques de memoria y genera una excepción si se produce un error en la asignación:

    {
    char* p1 = (char*)malloc(SIZE_FIRST);
    if (p1 == NULL)
    AfxThrowMemoryException();
    char* p2 = (char*)malloc(SIZE_SECOND);
    if (p2 == NULL)
    {
       free(p1);
       AfxThrowMemoryException();
    }
    
    // ... Do something with allocated blocks ...
    
    // In normal exit, both blocks are deleted.
    free(p1);
    free(p2);
    }
    

    Si se produce un error en la primera asignación, simplemente puede generar la excepción de memoria. Si la primera asignación se realiza correctamente pero se produce un error en la segunda, debe liberar el primer bloque de asignación antes de generar la excepción. Si ambas asignaciones se realizan correctamente, puede continuar como lo haría normalmente y liberar los bloques al salir de la función.

    • O
  2. Use una excepción definida por el usuario para indicar una condición problemática. Puede iniciar un elemento de cualquier tipo, incluso una clase completa, como excepción.

    En el ejemplo siguiente, se intenta reproducir un sonido a través de un dispositivo de onda y se genera una excepción si se produce un error.

    #define WAVE_ERROR -5
       {
       // This Win32 API returns 0 if the sound cannot be played.
       // Throw an integer constant if it fails.
       if (!PlaySound(_T("SIREN.WAV"), NULL, SND_ASYNC))
          throw WAVE_ERROR;
       }
    

Nota:

El control predeterminado de excepciones de MFC solo se aplica a punteros a objetos CException (y objetos de clases derivadas de CException). En el ejemplo anterior, se omite el mecanismo de excepción de MFC.

Consulte también

Control de excepciones