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