Tratamento de Erros no clipper.

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

modulo
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 08 Set 2005 08:54

Tratamento de Erros no clipper.

Mensagem 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
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
miracle
Usuário Nível 3
Usuário Nível 3
Mensagens: 117
Registrado em: 14 Jun 2007 16:28
Localização: Sao Paulo SP

Mensagem 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)
Clipper 5.2e + DBFCDX + Exospace 1.0g
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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...
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

jah vi sistema que trata o erro do erro...
Uma gambiarra totalmente desnecessária.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem 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.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Tche, Eolo nunca usei isso !! nem mesmo tratamento de erro...vc poderia postar um exemplo de como seria o uso !!!
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem 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
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Entendi perfeitamente, Obrigado Maligno e Eolo !!!
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder