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.