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 !!!