Dúvida referente ao tratamento de erros no AdvPL

Boa tarde!

Possuo uma rotina via schedule que tem controle de semáforo, onde ela cria um arquivo ao iniciar, deixa ele aberto enquanto processa e fecha assim que concluí o processo. Essa rotina executa de 10 em 10 minutos.

Dessa forma, se esse processamento demorar mais de 10 minutos e outro processo iniciar, caso ele não conseguir criar o arquivo, é porque ainda existe um processamento em aberto. Assim, essa segunda tentativa é abortada.

Acontece que de vez em quando essa rotina gera alguns error logs devido a cadastro incorreto, e devido ao error log, a rotina é encerrada antes de fechar o arquivo. Então, quando novos processos tentam ser executados, eles não conseguem pois o arquivo ainda está em aberto.

Gostaria de melhorar esse processo, de modo que mesmo que gere error log, o semáforo se feche.

Minha dúvida é se consigo executar um bloco de Begin Sequence, que caso ocorra um erro no processo, eu consiga fechar o arquivo antes de finalizar a rotina.

Caso não existir, alguém sabe de alguma forma mais inteligente e eficaz para realizar este controle de semáforo?

Agradeço desde já pela atenção.

Giordano, boa tarde.

Tente utilizar a função ErrorBlock, acredito que ela possa lhe ajudar no que você precisa.

Link TDN: http://tdn.totvs.com/display/tec/ErrorBlock

Tem também essa outra: http://tdn.totvs.com/display/tec/SysErrorBlock

Interessante Felipe, vou dar uma olhada! Obrigado.

Em anexo tem um exemplo (T75RUN.prw) utilizando BEGIN SEQUENCE (espécie de Try/Catch do ADVPL) em conjunto com a função ErrorBlock() indicada pelo Felipe Caiado Almeida.

Nele você pode simular um erro e ver que a conexão não é derrubada e o motivo do erro é retornado na variável cError (por meio da bError).


Tem também esse exemplo da página BlackTDN que exemplifica como utilizar para recuperação automática de erros:

TRY/CATCH/END: Quando utilizar?

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Boa noite, Guilherme! Estava fazendo uns testes com Begin Sequence e aparentemente vai servir. Sabe me confirmar qual é o comportamento dele com o Final? O Final executa as tratativas informadas no Recover?

Boa tarde Giordano, assim como o Felipe indicou, você terá de utilizar do Begin Sequence/End Sequence, porém esse tratamento não segura todas as exceções, mesmo com tal tratamento, existem exceções que o binário aborta a thread, portanto não é um método 100% eficaz.

Acredito que seu controle de lock, semáforo e tratamento de exceção possa ser resolvido pela função LockByName:

http://tdn.totvs.com/pages/releaseview.action?pageId=6814894

Muito cuidado ao utilizar a função SysErrorBlock, você pode remover o tratamento de erro default do Protheus e as consequências são diversas.

Boa noite, Daniel! Estava fazendo uns testes com Begin Sequence e aparentemente vai servir. Sabe me confirmar qual é o comportamento dele com o Final? O Final executa as tratativas informadas no Recover?

Você se refere a função Final da LIB?

Essa mesmo, Daniel.

A função Final tem um comportamento diferente quando não existe interface, se for utilizar dela, utilize fora do seu Begin Sequence, aí ela trata de encerrar a thread.

Entendi, Daniel. Mas digo por exemplo: Estou colocando meu Begin Sequence chamando uma Static Function, dentro dessa função está ocorrendo um Final ao invés de um error log. O comportamento do Recover do Begin Sequence é executado normalmente? Ou a thread finaliza antes?

A função Final vai tentar encerrar a thread via exceção, se você capturar o bloco de erro via Begin Sequence, a thread não será finalizada, porém se essa mesma função é chamada via interface, a final força o encerramento mesmo com blocos de erro.

Show! Obrigado pela explicação, Daniel.