Manejant errors (només projectes visuals)


Per tal de tenir un control millor i més acurat, podeu manejar els errors a nivell de procediment (o fins i tot a nivell de missatge) amb aquestes dues macros:

    StartErrorHandler (<Offset HandlerAddress>)

    EndErrorHandler

StartErrorHandler inicia la comprovació d'errors, indicant l'adreça que rebrà el control quan es produeixi un error, mentre queEndErrorHandler finalitza la comprovació d'errors. La utilització d'aquestes macros és la següent:

AnyProcedure Proc
    StartErrorHandler (Offset ErrorsPlace)
    codi.....
Exit:
    EndErrorHandler
    Ret

ErrorsPlace:
    Cmp D[Error. Code], 0C0000005H; Violació d'accés de lectura
    Jne < Exit
    fer alguna operació
    Jmp < Exit
AnyProcedure EndP

Aquesta comprovació d'errors estarà activa al llarg de tot el codi que hi hagi entre les dues sentències (StartErrorHandler i EndErrorHandler), i d'altres procediments que es cridin des d'aquí dins (a menys que aquests altres procediments tinguin la seva pròpia comprovació d'errors), fins que s'arribi a EndErrorHandler(a l'exemple, al final del procediment). És molt important, per tal que l'aplicació treballi correctament, que cada StartErrorHandler tingui el seu corresponent EndErrorHandler dins del mateix nivell (habitualment al final del procediment).

Encara podeu acurar més la comprovació d'errors. Per exemple:

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

ErrorsPlace1:
    Cmp D[Error.Code], 0C0000005H ; Violació d'accés de lectura
    Jne > Exit1
    fer alguna operació

Exit1:
    EndErrorHandler
    Jmp > End

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

ErrorsPlace2:
    Cmp D[Error.Code], 0C0000005H ; Violació d'accés de lectura
    Jne > Exit2
    fer alguna operació

Exit2:
    EndErrorHandler
End:
    Return(TRUE)

La comprovació d'errors funciona igual que els codis d'operació Push i Pop. Per tant, com s'ha dit abans, heu d'escriure un EndErrorHandler per cada StartErrorHandler dins del mateix nivell (cal tenir en compte si el procediment té dues o més sentències Ret o Return), per tal que es tregui l'adreça de comprovació de la pila. Si no ho feu així, la propera vegada que l'execució del programa entri al procediment per processar qualsevol altre missatge i es produeixi un error, no funcionarà correctament.