Manejando errores (sólo proyectos visuales)


Para tener un control mejor y mas preciso, puede manejar los errores a nivel de procedimiento (o incluso a nivel de mensaje) con estas dos macros:

    StartErrorHandler (<Offset HandlerAddress>)

    EndErrorHandler

StartErrorHandler inicia la comprobación de errores, indicando la dirección que recibirá el control cuando se produzca un error, mientras que EndErrorHandler finaliza la comprobación de errores. La utilización de estas macros es la siguiente:

AnyProcedure Proc
    StartErrorHandler (Offset ErrorsPlace)
    código...
Exit:
    EndErrorHandler
    Ret

ErrorsPlace:
    Cmp D[Error.Code], 0C0000005H ; Violación de acceso de lectura
    Jne < Exit
    hacer alguna operación
    Jmp < Exit
AnyProcedure EndP

Esta comprobación de errores estará activa a lo largo de todo el código que haya entre las dos sentencias (StartErrorHandler y EndErrorHandler), y otros procedimientos que se llamen desde aquí (a menos que estos otros procedimientos tengan su prpia comprobación de errores), hasta que se llegue a EndErrorHandler (en el ejemplo, al final del procedimiento). Es muy importante, para que la aplicación trabaje correctamente, que cada StartErrorHandler tenga su correspondiente EndErrorHandler dentro del mismo nivel (habitualmente al final del procedimiento).

Todavía puede precisar mas la comprobación de errores. Por ejemplo:

    Cmp D[uMsg], WM_CREATE
    Jne >L2
    StartErrorHandler (Offset ErrorsPlace1)
    código...
    Jmp > Exit1

ErrorsPlace1:
    Cmp D[Error.Code], 0C0000005H ; Violación de acceso de lectura
    Jne > Exit1
    hacer alguna operación

Exit1:
    EndErrorHandler
    Jmp > End

L2:
    Cmp D[uMsg],
WM_DESTROY
    Jne > Exit2
    StartErrorHandler (Offset ErrorsPlace2)
    código...
    Jmp > Exit2

ErrorsPlace2:
    Cmp D[Error.Code], 0C0000005H ; Violación de acceso de lectura
    Jne > Exit2
    hacer alguna operación

Exit2:
    EndErrorHandler
End:
    Return(TRUE)

La comprobación de errores funciona igual que los códigos de operación Push y Pop. Por lo tanto, como se ha dicho antes, debe escribir un EndErrorHandler por cada StartErrorHandler dentro del mismo nivel (hay que tener en cuenta si el procedimiento tiene dos o más sentencias Ret o Return), para que se quite la dirección de comprobación de la pila. Si no lo hace así, la próxima vez que la ejecución del programa entre en el procedimiento para procesar cualquier otro mensaje y se produzca un error, no funcionará correctamente.