Uso correto do RECOVER USING com o BEGIN SEQUENCE

Olá,

Qual a forma correta de usar o RECOVER USING < variável >?

No TDN é mencionado, mas não tem exemplo, eu tentei de várias formas mas não consigo recuperar o erro do ErrorBlock e passar para o Recovery.

https://tdn.totvs.com/display/public/framework/BEGIN+SEQUENCE+...+END


    Local oError := ErrorBlock({|e| Break(e)})
    Local cTeste

    BEGIN SEQUENCE
        If "a" == 1

        Endif
    RECOVER USING oErrorBlock
        cTeste := oErrorBlock:Description
    END SEQUENCE

    MsgAlert(cTeste)

    ErrorBlock(oError)

Inclusive em alguns repositórios usando xBase/Clipper, tem alguns fontes que utilizam semelhante ao exemplo acima: https://github.com/ibarrar/clipper/blob/4ff3209b5f889121eeae870df702d179b2498553/CLIPPER5/SOURCE/ERRORSYS/ERR11.PRG#L48

Olá,

Eu não costumo fazer uso o recover, muito menos do using, para recuperar o erro, eu utilizo do próprio objeto de erro recebido no bloco de código.

Exemplo com Begin Sequence:

//-------------------------------------------------------------------
/*/{Protheus.doc} errBlock
Exemplo de Begin Sequence

@sample u_errBlock
@author Dan M
@since 08/03/2025
@version 1.0
//-----------------------------------------------------------------*/
user function errBlock()
local bError as codeblock
local cTeste as character

bError := ErrorBlock({|oException| cTeste := oException:description, Break(oException)})

BEGIN SEQUENCE
    if aTest[0] == 1

    endif
END SEQUENCE

ErrorBlock(bError)

MsgAlert(cTeste, "BeginSequence-ErrorBlock")

return

Já em TLPP, temos o try/catch, sua implementação fica até mais simples, visto que não preciso fazer a tratativa e restauração do bloco de erro.

Exemplo com Try/Catch:

//-------------------------------------------------------------------
/*/{Protheus.doc} errTryCatch
Exemplo de Try/Catch

@sample u_errTryCatch
@author Dan M
@since 08/03/2025
@version 1.0
//-----------------------------------------------------------------*/
user function errTryCatch()
local cTeste as character
local oException as object

try
    if aTest[0] == 1

    endif
catch oException
    //Aqui entra se der erro
    cTeste := oException:description
finally
    //Aqui SEMPRE entra
    ConOut("Finalizou o Try/Catch")
endtry

MsgAlert(cTeste, "Try/Catch")

return

Documentações:
https://tdn.totvs.com/display/public/framework/BEGIN+SEQUENCE+…+END
Try...Catch - TOTVSTEC - TDN

2 curtidas