Controlando las excepciones (sólo proyectos visuales)


Easy Code puede crear un manejador de errores para capturar las excepciones que se producen durante la ejecución del programa, de manera que puede manejar los errores a nivel de procedimiento (o incluso a nivel de mensaje) con estas dos macros:

    StartErrorHandler <Offset HandlerAddress>

    EndErrorHandler


StartErrorHandler
indica el inicio del control de errores, especificando la dirección efectiva que recibirá el control cuando se produzca un error, mientras que EndErrorHandler indica el final del manejo de errores. Puede usar estas dos macros de la siguiente manera:

AnyProcedure Proc
    StartErrorHandler Offset ErrorsPlace
    .........
    código.....
    .........
    EndErrorHandler
@@: Ret

ErrorsPlace:
    EndErrorHandler
    .If Error.lCode == 0C0000005H ;Violación de acceso de lectura
        do something
    .EndIf
    Jmp
@B
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 propia 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:

    .If uMsg == WM_CREATE
        StartErrorHandler Offset ErrorsPlace1
        .........
    
    código.....
        .........
        EndErrorHandler
@@:     Ret


ErrorsPlace1:
        EndErrorHandler
        .If Error.lCode == 0C0000005H ;Violación de acceso de lectura
            do something
        .EndIf
        Jmp @B


    .ElseIf uMsg == WM_DESTROY
        StartErrorHandler Offset ErrorsPlace2
        .........
    
    código.....
        .........
        EndErrorHandler
@@:     Ret


ErrorsPlace2:
        EndErrorHandler
        .If Error.lCode == 0C0000005H ;Violación de acceso de lectura
            do something
        .EndIf
        Jmp @B

    .EndIf

Esta comprobación de errores no puede ser recursiva, 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.

OBSERVACIONES: Todo el código mostrado anteriormente ha sido escrito con la sintaxis de Masm. Deberá hacer las modificaciones necesarias para otros ensambladores.