Página 1 de 1
Tratamento de Erros no clipper.
Enviado: 14 Ago 2007 11:32
por modulo
Como tratar um erro para quer o programa não aborte?
Por exemplo: alias does not exist - Dos Error 3 - O sistema aborta.
Não quero que ele aborte, apenas dê a mensagem por n segundos e eu siga meu processo no sistema. É um sistema em lote, que fica rodando continuamente na retaguarda, abrindo o sistema em terminais. Se um terminal é ressetado, pode vir a dar este erro. Mas o sistema deve continuar processando.
Aguardo retorno.
Sds,
Eliseu Schneider
Módulo Info
Enviado: 14 Ago 2007 11:44
por Maligno
No exemplo que você citou, de duas uma: ou o erro é seu ou o erro advém de uma condição que poderia ter sido testada por você. Ou seja, erro seu também.
Não há uma forma de tratar erros desse tipo para que não aborte o programa, já que, nesta condição, o programa não pode mesmo continuar, por quê não haveria o que fazer. É um erro classificado como catastrófico. Depois que o erro apareceu, não tem jeito. Você deve prover o sistema com mecânismos que evitem o erro e assim, o aborto. Feito isso, do jeito certo, nunca aparecerão erros desses tipo.
Exemplo: DOS ERROR 3, como está nesta sua mensagem, significa "path not found". Você deveria ter tratado disso antes de tentar abrir o arquivo.
Enviado: 14 Ago 2007 11:56
por miracle
Maligno, mas não há um modo de o Modulo usar a classe ErrorSys para interceptar essa mensagem e mandar o sistema apenas exibir essa mensagem de erro, e dar um loop para continuar? Acho que é isso que ele quer fazer, embora eu também não saiba como. Sei que no Visual Basic tem como, mas estamos falando de Clipper... ´o)
Enviado: 14 Ago 2007 12:11
por Maligno
Se a possibilidade de erro for tratada adequadamente, não será necessário modificar o tratamento de erros pra poder continuar a execução do programa. Foi isso o que eu quis dizer.
Acho que modificar o tratador de erros só pro programa não abortar, é algo totalmente desnecessário.
Enviado: 14 Ago 2007 16:06
por sygecom
Bom, o que o Maligno disse eu concordo...se ajustar o sistema certinho, não vejo motivo de ele dar erro...agora...jah vi sistema que trata o erro do erro...hehe e retorna na boa para o sistema...até mesmo quando a cagada é feia...mas infelizmente não tenho o sistema e muito menos os fontes desse sistema...somente vi em um cliente e percebi que isso é possviel...
Enviado: 14 Ago 2007 16:15
por Maligno
jah vi sistema que trata o erro do erro...
Uma gambiarra totalmente desnecessária.
Enviado: 14 Ago 2007 18:29
por sygecom
Maligno escreveu:Uma gambiarra totalmente desnecessária.
Tmb. acho...mas só sei que funciona bem...alias lembrando um exemplo de errosys é o que esta na seção de Download aqui do site do PCTOLEDO...
https://pctoledo.org/download/cop ... t&deonde=2
Abraços
Leonardo Machado
Enviado: 14 Ago 2007 19:03
por Eolo
Pessoal, tem uma saída, nativa do Clipper: BEGIN SEQUENCE / RECOVER USING / END. Tá no NG, em Statements. Montei esse esquema em um sistema meu, pra testar, e funciona legal. Não controla 100% dos erros, mas chega bem perto.
Se dá um pau qualquer, eu faço voltar (de onde estiver) pro Menu inicial, isto depois de mostrar na tela qual erro foi, em que rotina e linha etc. É bem bacana. E tem nada a ver com o Errorsys.
Enviado: 14 Ago 2007 19:23
por sygecom
Tche, Eolo nunca usei isso !! nem mesmo tratamento de erro...vc poderia postar um exemplo de como seria o uso !!!
Enviado: 14 Ago 2007 19:27
por Maligno
Retirado de parte do executor do WAPI. Se a função do SwpRunCmd() não estiver ligada ao programa, a função Break() fará o código seguir no "recover". Ou seja, usará o RUN.
Código: Selecionar todos
bError := ErrorBlock({|o|Break(o)})
begin sequence
lRet := SwpRunCmd(cCommand,0,,WAPITmpDir())
recover
run (cCommand)
lRet := _kTRUE
end
ErrorBlock(bError)
No demais, o NG contem muitos outros detalhes.
Enviado: 14 Ago 2007 19:45
por Eolo
Leonardo,
Limpei o que é específico do meu sistema e deixei só o que interessa na recuperação de erros (o que, aliás, é quase cópia do exemplo do NG):
Código: Selecionar todos
* programa principal
do whil .t.
* aqui, achoice com as opções do menu
priv objLocal,bLastHandler
blasthandler:=errorblock({ |objerr| ;
myhandler(objerr,.t.,procname(1)+"("+alltrim(str(procline(1)))+")" , procname(2)+"("+alltrim(str(procline(2)))+")",procname(3)+"("+alltrim(str(procline(3)))+")",procname(4)+"("+alltrim(str(procline(4)))+")") })
begin sequence
do case
* aqui as funções de cada opção do menu
endc
* se houve algum pau no DO CASE, aciona o RECOVER
recover using objlocal
clos databases
if objlocal:genCode != 0
? "ERRO"
a=listaerro[1]
a=iif("(0)"$listaerro[2],a,a+", "+listaerro[2])
a=iif("(0)"$listaerro[3],a,a+", "+listaerro[3])
a=iif("(0)"$listaerro[4],a,a+", "+listaerro[4])
?"* Rotina: "+a
?"* Descrição: "+upper(objLocal:description)
?"* Objeto: "+objLocal:operation
do whil .t.
inkey(0)
if lastkey()=27
exit
endi
endd
endi
end
* daqui, volta pro loop, pro menu do programa
errorblock(blasthandler)
endi
endd
Código: Selecionar todos
FUNCTION MyHandler(objError,lLocalHandler,rot1,rot2,rot3,rot4)
aadd(listaerro,rot1)
aadd(listaerro,rot2)
aadd(listaerro,rot3)
aadd(listaerro,rot4)
IF lLocalHandler
BREAK objError
ENDIF
RETURN NIL
Enviado: 14 Ago 2007 20:02
por sygecom
Entendi perfeitamente, Obrigado Maligno e Eolo !!!