Clipper On Line • Ver Tópico - Rotina de erros

Rotina de erros

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

Rotina de erros

Mensagempor JoséQuintas » 10 Jul 2020 13:03

Eu uso isto e funciona:

      BEGIN SEQUENCE WITH __BreakBlock()
         IF ::cn:State() != AD_STATE_OPEN
            ::Cn:Open()
         ENDIF
         DO WHILE ::cn:State() != AD_STATE_OPEN
            Inkey(1)
         ENDDO
         lOk := .T.
      ENDSEQUENCE
      IF lOk
         EXIT
      ENDIF
      Mensagem( "Falhou pra conectar com servidor, tentativa " + LTrim( Str( nCont ) ) + "/5" )
      BEGIN SEQUENCE WITH __BreakBlock()
         cMessage := LTrim( Str( ::Cn:Errors(0):Number() ) ) + " " + ::Cn:Errors(0):Description()
         Mensagem( cMessage )
         Errorsys_WriteErrorLog( cMessage, 3 )
      ENDSEQUENCE


Mas gostaria de usar a própria rotina de erros do Harbour, usando o objeto error.
Alguém tem algum exemplo?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18155
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Rotina de erros

Mensagempor JoséQuintas » 10 Jul 2020 13:08

Ou por exemplo aqui:

   IF ::Eof()
      xValue := 0
   ELSE
      xValue := ::Rs:Fields( xField ):Value
   ENDIF


Neste caso um algo mais, mostrando o conteúdo de xField, que é o nome/número do campo
Mostrar o nome que está errado, facilita muito mais do que ter que conferir na lista cada nome.

FOR EACH cField IN { "IPPRECUS", "IPPREPED", "IPQTDE", "IPVALCUS", "IPGARANTIA", ;
   "IPPRENOT", "IPVALADI", "IPVALFRE", "IPVALSEG", "IPVALOUT", "IPVALEXT", ;
   "IPVALADU", "IPVALIOF", "IPVALDES", "IPVALPRO", "IPVALNOT", "IPIIBAS", ;
   "IPIIALI", "IPIIVAL", "IPIPIBAS", "IPIPIALI", "IPIPIVAL", "IPICMBAS", ;
   "IPICMALI", "IPICMRED", "IPICMVAL", "IPFCPALI", "IPFCPVAL", "IPICSBAS", ;
   "IPICSALI", "IPICSVAL", "IPSUBIVA", "IPSUBBAS", "IPSUBRED", "IPSUBALI", ;
   "IPSUBVAL", "IPDIFBAS", "IPDIFALIF", "IPDIFALIU", "IPDIFALII", "IPDIFVALI", ;
   "IPDIFVALF", "IPPISBAS", "IPPISALI", "IPPISVAL", "IPCOFBAS", "IPCOFALI", ;
   "IPCOFVAL", "IPISSBAS", "IPISSALI", "IPISSVAL" }
   :QueryAdd( cField, :Number( cField ) )
NEXT
:QueryExecuteInsert( "JPITPED" )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18155
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Rotina de erros

Mensagempor Vlademiro » 10 Jul 2020 13:27

Você não está recuperando o erro, só está usando uma parte da solução.

Tem que pegar o erro com RECOVER

PROCEDURE MAIN

    LOCAL oError
    LOCAL c

     BEGIN SEQUENCE WITH __breakblock()
        ? c + "122"
     RECOVER USING oError
         ? hb_valtoexp( oError:Description)
         ? oError:Filename
         ? oError:Severity
         ? oError:SubCode
         ? oError:Subsystem
     END SEQUENCE

        RETURN

Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Rotina de erros

Mensagempor Vlademiro » 10 Jul 2020 13:29

As informações do campo que deu erro coloca no RECOVER
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Rotina de erros

Mensagempor JoséQuintas » 10 Jul 2020 14:21

É quase isso.
Seria justamente criar o objeto error, com as informações que não tem lá.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18155
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Rotina de erros

Mensagempor JoséQuintas » 10 Jul 2020 14:37

Achei em netiomt.prg

      oError := ErrorNew()

      oError:severity    := ES_ERROR
      oError:genCode     := EG_UNSUPPORTED
      oError:subSystem   := "HBNETIO"
      oError:subCode     := 0
      oError:description := hb_langErrMsg( EG_UNSUPPORTED )
      oError:canRetry    := .F.
      oError:canDefault  := .F.
      oError:fileName    := ""
      oError:osCode      := 0

      Eval( ErrorBlock(), oError )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18155
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Rotina de erros

Mensagempor Vlademiro » 10 Jul 2020 14:44

Eu pensei que você estava querendo saber informações sobre o campo que originou o erro. Se fosse isso o exemplo que eu te dei atende, basta gravar em um log dentro do bloco RECOVER ou exibir em um alert antes de você mesmo sair do sistema.

Você quer colocar as informações personalizadas do seu erro dentro do objeto do Harbour ? Pra que isso ??
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Rotina de erros

Mensagempor JoséQuintas » 10 Jul 2020 14:47

Neste aqui levemente diferente:

#define THROW( oErr )      ( Eval( ErrorBlock(), oErr ), Break( oErr ) )
...
oError := ErrorNew()

oError:GenCode     := EG_UNSUPPORTED
oError:SubCode     := 1000  /* EDBF_UNSUPPORTED */
oError:Description := hb_langErrMsg( EG_UNSUPPORTED ) + " (" + ;
   "database in use)"
oError:FileName    := cFullName
oError:CanDefault  := .T.
THROW( oError )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18155
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Rotina de erros

Mensagempor JoséQuintas » 10 Jul 2020 14:49

Vlademiro escreveu:Você quer colocar as informações personalizadas do seu erro dentro do objeto do Harbour ? Pra que isso ??


Usar a própria rotina de erros padrão do Harbour.
E assim, já entra todo tratamento padrão que já faço.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18155
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Rotina de erros

Mensagempor Vlademiro » 10 Jul 2020 14:57

O objeto error você já tem quando o RECOVER é acionado, daí é só adicionar no description do objeto


oError:description := hb_langErrMsg( EG_UNSUPPORTED ) + " / Mais mensagens personalizadas do sistema para complementar a informação"



Não sei se nesse objeto tem uma propriedade "cargo". Realmente não vejo necessidade disso, basta pegar o erro e gravar/exibir/enviar e-mail dentro de RECOVER.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Rotina de erros

Mensagempor Vlademiro » 10 Jul 2020 15:01

Quintas escreveu:Usar a própria rotina de erros padrão do Harbour.
E assim, já entra todo tratamento padrão que já faço.


Entendi.

Quando eu respondi vc já tinha postado mais coisas.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Rotina de erros

Mensagempor JoséQuintas » 10 Jul 2020 16:48

É que nesse meio tempo pesquisei aqui o fórum, internet, etc.
E depois lembrei que podia ter alguma coisa nos fontes do Harbour... e bingo... encontrei.

E ainda resolvi problemas em clientes...
Na maioria, erro por colocar letra a mais ou a menos nos nomes de campos kkkk
Foi justamente isso que gerou a idéia de usar a errorsys, porque dois ou mais campos daquela lista estavam errados.

Mas valeu, ainda vou estudar como implementar isso.
Talvez uma rotina passando a string, assim chamo de várias partes do aplicativo sem precisar encher de código fonte.
E poderia até aproveitar e fechar a conexão SQL/hbnetio nessa rotina, antes de sair do aplicativo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18155
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Rotina de erros

Mensagempor Linguagemclipper » 12 Abr 2022 10:53

Olá, pessoal!
Eu achei este tópico porque estou procurando uma rotina de tratamento de erros para meu sistema para que eu não fique reinventando a roda... rs
Por fim alguém poderia compartilhar o código consolidado?
Hoje me deparei com um erro besta que supostamente faltou um lock... erros como esse quando detectados eu poderia resolver na rotina? Tipo um erro que faltou um lock, dá um lock e segue o baile! Dessa forma o sistema não vai quebrar à toa por qualquer besteirinha.

Observei que quando o sistema quebra ele sempre sai no EXIT PROCEDURE. Desta forma eu posso verificar se existe o error.log depois envio para uma pasta FTP no meu servidor e apago ele... boto o nome do arquivo o CNPJ do cliente: CNPJ+DTOS(DATE())+ALLTRIM(STR(SECS(TIME())))+".log"

Enfim, gostaria de ver como seria a função de tratamento de erros.
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Avatar de usuário

Linguagemclipper
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 214
Data de registro: 16 Abr 2016 17:33
Cidade/Estado: Maceió/AL
Curtiu: 38 vezes
Mens.Curtidas: 12 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro