Rotina de erros

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de erros

Mensagem por JoséQuintas »

Eu uso isto e funciona:

Código: Selecionar todos

      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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de erros

Mensagem por JoséQuintas »

Ou por exemplo aqui:

Código: Selecionar todos

   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.

Código: Selecionar todos

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Rotina de erros

Mensagem por Vlademiro »

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

Tem que pegar o erro com RECOVER

Código: Selecionar todos

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 do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Rotina de erros

Mensagem por Vlademiro »

As informações do campo que deu erro coloca no RECOVER
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de erros

Mensagem por JoséQuintas »

É 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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de erros

Mensagem por JoséQuintas »

Achei em netiomt.prg

Código: Selecionar todos

      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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Rotina de erros

Mensagem por Vlademiro »

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de erros

Mensagem por JoséQuintas »

Neste aqui levemente diferente:

Código: Selecionar todos

#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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de erros

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Rotina de erros

Mensagem por Vlademiro »

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

Código: Selecionar todos


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 do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Rotina de erros

Mensagem por Vlademiro »

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina de erros

Mensagem por JoséQuintas »

É 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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Rotina de erros

Mensagem por Linguagemclipper »

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.
Responder