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.