Página 1 de 1

Rotina de erros

Enviado: 10 Jul 2020 13:03
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?

Rotina de erros

Enviado: 10 Jul 2020 13:08
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" )

Rotina de erros

Enviado: 10 Jul 2020 13:27
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


Rotina de erros

Enviado: 10 Jul 2020 13:29
por Vlademiro
As informações do campo que deu erro coloca no RECOVER

Rotina de erros

Enviado: 10 Jul 2020 14:21
por JoséQuintas
É quase isso.
Seria justamente criar o objeto error, com as informações que não tem lá.

Rotina de erros

Enviado: 10 Jul 2020 14:37
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 )

Rotina de erros

Enviado: 10 Jul 2020 14:44
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 ??

Rotina de erros

Enviado: 10 Jul 2020 14:47
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 )

Rotina de erros

Enviado: 10 Jul 2020 14:49
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.

Rotina de erros

Enviado: 10 Jul 2020 14:57
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.

Rotina de erros

Enviado: 10 Jul 2020 15:01
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.

Rotina de erros

Enviado: 10 Jul 2020 16:48
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.

Rotina de erros

Enviado: 12 Abr 2022 10:53
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.