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 producidas por funciones en MFC u otras bibliotecas. Además de detectar excepciones producidas por código de biblioteca, puede iniciar excepciones desde su propio código si está escribiendo funciones que pueden encontrarse con condiciones excepcionales.

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

Para iniciar una excepción

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

    En el ejemplo siguiente, una función intenta asignar dos bloques de memoria y produce 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 iniciar 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 iniciar la excepción. Si ambas asignaciones se realizan correctamente, puede continuar 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 de problema. 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 produce 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 las excepciones de MFC solo se aplica a punteros a CException objetos (y objetos de CExceptionclases derivadas). En el ejemplo anterior se omite el mecanismo de excepción de MFC.

Consulte también

Manejo de Excepciones