ErrorSys com erro

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

Moderador: Moderadores

leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

ErrorSys com erro

Mensagem por leandrolinauer »

boa tarde.
Já fiz varias substituições da função errorsys() mas continuo com erro.
Não sei se é erro na função errorsys ou no HARBOUR 3.4

Ocorre alguns erros direto e em lugar que não há a minima possibilidade de falha.
Exemplo ultimo.
Dentro do meu codigo de venda faço varias vezes nao da problema algum, derepende o erro aparece do nada.
.... varias linhas iniciais
.... faço varias aberturas de arquivos e indices, inclusive a linha abaixo abrindo vendedores.
NetUseFile("CDUP0600",{"CDUP0600","CDUP0601","CDUP0602"},.T.,,,,,.T.,,wD_Instal)
.... outras linhas
....
Atualizo uma variavel dentro da NETUSEFILE se não abrir algum, der algum problema, wnetuse se torna falso para nao abrir a tela de venda.
..., foi atualizada e wnetuse é .T.
cheguei aqui e eu erro e detalhe, é sequencial até esta linha, não tem como chegar nela senão passar pela de cima.
If wNetUse=.T.
CDUP0600->(DbGoTop()) //erro desta vez nesta linha 339

mesagem do erro enviado pelo sistema porque a funcao errorsys foi envocada
Descrição..........: Alias does not exist
Linha..............: 339
e não tem como o arquivo não estar aberto o alias existe e da erro.
Se der vai ser uma vez, depois ocorre em outro lugar.
Será algum problema no HARBOUR 3.4 ou algum problema na ERRORSYS.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

ErrorSys com erro

Mensagem por leandrolinauer »

Bom dia.
Então pode ser algum cabo, conector ou até mesmo algum hub com defeito e deu alguma pequena perca de pacote.
Vou rever os equipamentos e cabos.
Valeu.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

ErrorSys com erro

Mensagem por ANDRIL »

Geralmente é rede mesmo como disse o Itamar.

Mas tenho um cliente que acontece erros improváveis, tipo, um arquivo DBF acusando área não aberta quando vc sabe que não tem como não estar devido ao trecho de código, as verificações que são feitas antes, como o colega acima relatou.

Nesse cliente testei a rede pelo ping não cai de jeito nenhum, não dá delay... E o problema ocorre em máquinas alternadas. Detalhe não acontecia isso antes foi de um tempo para cá.

Penso que seja o servidor que bloqueia ou deleta os arquivos, o antivirus ou até mesmo vírus, ou HD judiado ou mesmo o Windows. Neste servidor, não da acesso ao Windows Defender para colocar a pasta na exceção nem para analisar o disco a procura de vírus.

Fica difícil solucionar até por que não quer mudar o servidor de máquina.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ErrorSys com erro

Mensagem por JoséQuintas »

Do jeito que mostrou a abertura de arquivos, eu desconfio dela também, independente do resto.
Talvez em rotina de recuperação acescentar também algum tipo de aviso pra você.

Uma situação comum de acontecer isso é deixar máquina parada, ou entrar em suspensão, e outros.
O tempo default de conexões ao servidor é de uns 15 minutos, passou disso o terminal é desconectado, caso não "dê sinal de vida".

Não tem muito o que inventar em abrir arquivos, é tudo igual, exceto na reindexação.
Sempre usei pra DBFs, e ainda uso em um cliente:

Código: Selecionar todos

IF ! AbreArquivos( "clientes", "fornecedores", "banco", "financeiro" )
   RETURN
ENDIF
Essa rotina chama o individual

Código: Selecionar todos

lAbriu :+ .T.
FOR EACH cFile IN aList
   IF ! AbreUmArquivo( cFIle )
       lAbriu := .F.
       EXIT
   ENDIF
NEXT
IF ! lAbriu
   CLOSE DATABASES
ENDIF

RETURN lAbriu   
E por último a individual abrindo arquivo e índices.

Regra básica de índices: abrir sempre todos os índices na mesma ordem, sendo assim, vai abrir sempre igual no aplicativo inteiro.
CDX mais fácil, vai ser arquivo único com tudo dentro, respeitando o máximo de 50 índices em cada um.

Tenho lá a rotina genérica Encontra( chave, alias, ordem )
Coloquei nela a abertura, caso não esteja aberto, e também acrescentei pra gravar isso como erro.
Eventualmente encontrava algum lugar faltando abrir, mas não gerava erro pro cliente, só pra mim.

Pode ser rede ? pode.... mas se o resto deixar na dúvida, é remover dúvidas.

Abrir tudo no início do aplicativo?
Nunca usei dessa forma, acho muito pior.
Se eu quiser pesquisar fontes que mexem com determinado arquivo, melhor que cada fonte mostre quais são, e não vou perder tempo com outros fontes.

Se abre tudo igual, e testa tudo igual, sabe que o resultado vai ser igual.
Se abre passando parâmetros, como saber se em algum lugar os parâmetros estão diferentes?

Normalmente o apliativo tem diversas bifurcações, e nem sempre passa por todas.
Pode ter mudança de área num deles, ou fechar temporário, ou outra coisa.

No AbreArquivo() tenho algo mais:

Código: Selecionar todos

nSelect := Select( "vaiabrir" )
Não se trata apenas de abrir, é verificar se já está aberto, talvez fechar antes de reabrir.
De repente está abrindo um aberto, e por isso não abre, mas considera que abriu.

Tudo é possível.
Apenas tenha certeza de que realmente resolveu os possíveis, antes de ir pro fora do normal.
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

ErrorSys com erro

Mensagem por JoséQuintas »

Abre a lista de arquivos

Código: Selecionar todos

FUNCTION AbreArquivos( ... )

   LOCAL nCont, lAbriu := .T., cDbfName, nSelect, acDbfList

   acDbfList := hb_AParams()
   FOR nCont = 1 TO Len( acDbfList )
      cDbfName := Lower( acDbfList[ nCont ] )
      nSelect  := Select( cDbfName )
      SELECT ( nSelect )
      IF ! File( cDbfName + ".dbf" )
         MsgStop( "Arquivo " + cDbfName + ".dbf não existe!" )
         CLOSE DATABASES
         lAbriu := .F.
         EXIT
      ENDIF
      USE ( cDbfName )
      IF NetErr()
         CLOSE DATABASES
         MsgStop( "Arquivo " + cDbfName + " não pode ser aberto neste momento!" )
         lAbriu := .F.
         EXIT
      ENDIF
      IF ! Used()
         CLOSE DATABASES
         MsgStop( "Arquivo " + cDbfName + " não pode ser aberto. Pode estar ruim!" )
         lAbriu := .F.
         EXIT
      ENDIF
      IF Select( cDbfName ) == 0
         CLOSE DATABASES
         MsgStop( "Arquivo " + cDbfName + " falha na checagem de Select()" )
         lAbriu := .F.
         EXIT
      ENDIF
      IF Upper( Alias() ) != Upper( cDbfName )
         CLOSE DATABASES
         MsgStop( "Arquivo " + cDbfName + " falha na checagem de Alias()" )
         lAbriu := .F.
         EXIT
      ENDIF
      IF ! AbreInd( cDbfName )
         lAbriu := .F.
         CLOSE DATABASES
         EXIT
      ENDIF
   NEXT
   IF lAbriu
      GOTO TOP
   ENDIF

   RETURN lAbriu
abre um dbf

Código: Selecionar todos

FUNCTION UseSoDbf( cDbfFile, lExclusivo, lInfinito, lShowMsg )

   LOCAL lOk   := .T.

   hb_Default( @lExclusivo, .F. )
   hb_Default( @lInfinito, .F. )
   hb_Default( @lShowMsg, .T. )
   SELECT ( Select( cDbfFile ) )
   DO WHILE .T.
      IF lExclusivo
         USE ( cDbfFile ) EXCLUSIVE
      ELSE
         USE ( cDbfFile )
      ENDIF
      IF NetErr()
         USE
         IF ! lShowMsg
            lOk := .F.
            EXIT
         ENDIF
         IF ! MsgYesNo( cDbfFile + " não disponível ou em uso! Tentar novamente?" )
            lOk := .F.
            EXIT
         ENDIF
      ELSEIF ! Used()
         IF ! lShowMsg
            lOk := .F.
            EXIT
         ENDIF
         IF ! MsgYesNo( cDbfFile + " danificado! Tentar novamente?" )
            lOk := .F.
            EXIT
         ENDIF
      ELSE
         EXIT
      ENDIF
   ENDDO
   IF lOk .AND. lExclusivo
      DeleteOldFiles( cDbfFile + ".cdx", -1 )
   ENDIF

   RETURN lOk
abre os índices de um dbf

Código: Selecionar todos

FUNCTION AbreInd( cDbf )

   LOCAL oElement, lTxtAguarde, nRecOk, nRecTot, acIndice
   MEMVAR xCampo
   PRIVATE xCampo

   acIndice := IndDbf( cDbf )
   IF Len( acIndice ) == 0
      RETURN .T.
   ENDIF
   IF ! File( cDbf + ".cdx" )
      //IF ! fLock()
      //   MsgStop( "Arquivo está em uso! Não pode reindexar!" )
      //   RETURN .F.
      //ENDIF
      lTxtAguarde := File( "aguarde.txt" )
      IF ! lTxtAguarde
         ChecaAguarde( .T., "Reindexação em andamento" )
      ENDIF
      nRecOk  := 0
      nRecTot := 1 + ( LastRec() * Len( acIndice ) )
      WSave( MaxRow() - 1, 0, MaxRow(), MaxCol() )
      Mensagem()
      GrafTempo( "Criando " + cDbf + ".cdx" )
      FOR EACH oElement IN acIndice
         SET INDEX TO // para usar for
         GOTO TOP     // para usar for
         xCampo := oElement[ 2 ]
         IF Len( oElement ) == 2
            INDEX ON &xCampo TAG ( oElement[ 1 ] ) EVAL GrafInd( nRecOk, nRecTot )
         ELSE
            INDEX ON &xCampo TAG ( oElement[ 1 ] ) FOR &( oElement[ 3 ] ) EVAL GrafInd( nRecOk, nRecTot )
         ENDIF
         SET INDEX TO
         nRecOk += LastRec()
      NEXT
      WRestore()
      IF ! lTxtAguarde
         fErase( "aguarde.txt" )
      ENDIF
      SET INDEX TO
   ENDIF
   IF ! dbSetIndex( cDbf + ".CDX" )
      RETURN .F.
   ENDIF
   SET ORDER TO 1

   RETURN .T.
Antigamente eu usava opcionalmente HBNETIO.
Apenas adicionava "NET:" aos nomes de arquivos e índices nessas rotinas, caso fosse HBNETIO.
Parei de usar e removi isso.

Eu apenas estranho quando falam de problema de rede, porque nunca tive isso, mas é possível.

Até numa determnada versão de Windows havia problemas com directory(), porque quiseram otimizar o windows e Microsoft não atualizava a informação. Faz tempo isso.... acho que no começo do W7.
Essa foi a única vez que usei a função interna do harbour pra mexer no windows, pra ver se resolvia.

NUNCA MEXI EM MÁQUINA NENHUMA, é sempre o default.
Se inventar de usar programas que alteram a máquina, tá ferrado, porque nunca mais vai conseguir cancelar as mudanças, e vai ter que reinstalar o Windows pra voltar ao normal.
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

ErrorSys com erro

Mensagem por JoséQuintas »

Tem esta alteração na minha errorsys.

Código: Selecionar todos

   // Only retry IF open error 2014.09.24.1810
   IF e:OsCode == 64 .AND. e:GenCode == EG_OPEN
      //@ 15, 15 SAY "Servidor sumiu. Tentar novamente em 3 segundos"
      Inkey(3)
      RETURN .T.
   ENDIF
Foi em 2014, era recomendação, mas depois de 10 anos nem me pergunte sobre isso....
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

ErrorSys com erro

Mensagem por JoséQuintas »

Itamar M. Lins Jr. escreveu:Mas erro de DBGOTO, APPEND, SELECT... ERROS nas FUNÇÕES do HARBOUR DEPOIS DO ARQUIVO DBF ABERTO, como vamos corrigir isso ?
Pode ser uma implementação, que no meio de algo muda o SELECT em uso, ou algum abre/fecha adicional.

Por exemplo, a implementação pra resolver o problema, abrindo um arquivo não aberto, mas esquecendo de selecionar área nova pra ele, o que acaba fechando algum outro.
Ele comentou de ter feito isso pra contornar o problema, então, de um jeito ou de outro, o aplicativo contém alterações.

No meu aplicativo, por exemplo, eu tenho tabela especial pra determinados produtos.
Só vai entrar nessa rotina se for algum daqueles produtos.
Um erro nela seria eventual, só com os produtos relacionados a essa tabela, e o dbf dessa tabela é usado só nessa situação.

Por isso uso

Código: Selecionar todos

 SELECT ( Select( cDbfFile ) )
Abre na mesma área, caso seja o mesmo, ou na área ZERO, que é uma nova, nunca numa área em uso por outro arquivo.
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/
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

ErrorSys com erro

Mensagem por leandrolinauer »

Boa tarde a todos.
Fiquei sem responder devido a fazer teste em uma empresa.
Removi a função ERRORSYS e acabou o problema, nenhum erro mais em dias.
Chego a conclusão que é a função que faz ocorrer o erro.
o teste foi feito em produção, todos usando, nenhuma vez ocorreu erro enviando email (claro pq tirei), mas não ocorreu nem a tela de DOSERROR.
Tenho que modificar a ERRORSYS para ver aonde ocorre a falha.

Grato a todos.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ErrorSys com erro

Mensagem por JoséQuintas »

Errorsys é pra mostrar erro, não é pra resolver erro através dela.

Eu até envio erro por email, mas não é pela errorsys.
Ela apenas grava o erro, e abre o bloco de notas na tela.

E sim, o erro fica lá aberto na tela, pra todo mundo ver.

O que faço é salvar em HB_OUT.LOG, o arquivo default do harbour.
Ao entrar no aplicativo, se existe conteúdo, se tem internet, envia o email.
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/
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

ErrorSys com erro

Mensagem por leandrolinauer »

Boa noite, creio que me expressei mal.
Sei que a errosys não conserta erro, verdade.
O problema está quando ela é acionada, ocorre em momentos e linha de código que já revisei a tempos não há como ocorrer erro aonde ela apontou, então fui radical e tirei a função até da compilação porque tenho ela em um fonte separado errosys.prg, feito isto o sistema parou de ocorrer erro, ou seja, nem a tela de doserror.
Então suponho que deve haver um probleminha no código que adaptei, até eu revisar, ficarei sem receber mensagens de algum erro verdadeiro.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ErrorSys com erro

Mensagem por JoséQuintas »

Veja se ajuda.

Código: Selecionar todos

/*
ERRORSYS                                                       *

...
2014.04.04.1355 - Nome do usuário JPA
2014.07.06.2130 - Ajuste ref. dos error 64 pra tentar contornar
2014.07.22.2130 - Ajuste ref. dos error 64 situações específicas
2014.08.08.1026 - Não tenta novamente em erro gravação
2014.09.24.1825 - Tenta somente se for erro 64 ref servidor
2014.10.28.0910 - Ajuste no texto
2016.06.30.1120 - Formatação do fonte
*/

#include "fileio.ch"
#include "error.ch"
#include "hbgtinfo.ch"
#include "hbmemory.ch"
#ifndef WIN_SW_SHOWNORMAL
   #define WIN_SW_SHOWNORMAL       1  // Harbour 3.4
   #define WIN_SW_SHOWMINNOACTIVE  7  // Harbour 3.4
#endif

// put messages to STDERR
#command ? <list,...>   =>  ?? hb_Eol() ; ?? <list>
#command ?? <list,...>  =>  OutErr(<list>)

* Note:  automatically executes at startup

PROCEDURE ERRORSYS

   ErrorBlock( { | e | JoseQuintasError( e ) } )

   RETURN

STATIC FUNCTION JoseQuintasError( e )

   LOCAL nCont, cMessage

   // by default, division by zero yields zero
   IF ( e:GenCode == EG_ZERODIV )
      RETURN 0
   ENDIF

   // build error message
   cMessage := ErrorMessage(e)
   hb_Default( @cMessage )
   IF ! Empty( e:OsCode )
      cMessage += ";(DOS Error " + Ltrim( Str( e:OsCode ) ) + ")"
   ENDIF
   IF cMessage == NIL
      cMessage := ""
   ENDIF

   // Only retry IF open error 2014.09.24.1810
   IF e:OsCode == 64 .AND. e:GenCode == EG_OPEN
      //@ 15, 15 SAY "Servidor sumiu. Tentar novamente em 2 segundos"
      Inkey(5)
      RETURN .T.
   ENDIF

   // For network open error, set NetErr() and subsystem default
   IF ( e:GenCode == EG_OPEN .AND. e:OsCode == 32 .AND. e:CanDefault )
      NetErr( .T. )
      RETURN ( .F. )     // NOTE
   ENDIF

   // for lock error during APPEND BLANK, set NetErr() and subsystem default
   IF ( e:GenCode == EG_APPENDLOCK .AND. e:CanDefault )
      NetErr( .T. )
      RETURN ( .F. )     // NOTE
   ENDIF
   Errorsys_WriteErrorLog( "SYSTEM ERROR", 1 ) // com id maquina
   @ MaxRow(), 0 SAY ""
   ? cMessage
   Errorsys_WriteErrorLog( cMessage )
   nCont := 2
   DO WHILE ( ! Empty( ProcName( nCont ) ) )
      cMessage := "Called from " + Trim( ProcName( nCont ) ) + "(" + Ltrim( Str( ProcLine( nCont ) ) ) + ")"
      ? cMessage
      Errorsys_WriteErrorLog( cMessage )
      nCont++
   ENDDO
   Errorsys_WriteErrorLog( ArgumentList( e ) )
   Errorsys_WriteErrorLog( Replicate( "-", 80 ) )
   ShellExecuteOpen( "notepad.exe", hb_Cwd() + "hb_out.log" )
   // give up
   ErrorLevel( 1 )
   QUIT

   RETURN .F.

STATIC FUNCTION ErrorMessage( e )

   LOCAL cMessage := ""

   // start error message
   BEGIN SEQUENCE WITH __BreakBlock()
      cMessage := if( e:Severity > ES_WARNING, "Error ", "Warning " )
   ENDSEQUENCE

   // add subsystem name IF available
   IF ( ValType( e:SubSystem ) == "C" )
      cMessage += e:SubSystem
   ELSE
      cMessage += "???"
   ENDIF

   // add subsystem's error code IF available
   IF ( ValType( e:SubCode ) == "N" )
      cMessage += ( "/" + Ltrim(Str( e:SubCode ) ) )
   ELSE
      cMessage += "/???"
   ENDIF

   // add error description IF available
   IF ( ValType( e:Description ) == "C" )
      cMessage += ( "  " + e:Description )
   ENDIF

   // add either filename or operation
   IF ! Empty( e:Filename )
      cMessage += (": " + e:Filename )
   ELSEIF ! Empty( e:Operation )
      cMessage += ( ": " + e:Operation )
   ENDIF

   RETURN cMessage

FUNCTION Errorsys_WriteErrorLog( cText, nDetail )

   LOCAL hFileOutput, cFileName, nCont, nCont2

   hb_Default( @cText, "" )
   hb_Default( @nDetail, 0 )

   IF nDetail > 0
      Errorsys_WriteErrorLog()
      Errorsys_WriteErrorLog( "Error on "       + Dtoc( Date() ) + " " + Time() )
      Errorsys_WriteErrorLog( "EXE Name; " + hb_Argv(0) )
//      Errorsys_WriteErrorLog( "JPA: "           + AppVersaoExe() )
      Errorsys_WriteErrorLog( "Memory:" + Ltrim( Str( Memory(0) / 1024 / 1024, 5, 2 ) ) + " GB" )
      Errorsys_WriteErrorLog( "Mem.VM:" + Ltrim( Str( Memory( HB_MEM_VM ) / 1024 / 1024, 5, 2 ) ) + " GB" )
//      Errorsys_WriteErrorLog( "Login JPA: "     + AppUserName() )
      Errorsys_WriteErrorLog( "Alias:  "        + Alias() )
      Errorsys_WriteErrorLog( "Folder: "        + hb_cwd() )
      Errorsys_WriteErrorLog( "Windows: "       + OS() )
      Errorsys_WriteErrorLog( "Computer Name: " + GetEnv( "COMPUTERNAME" ) )
      Errorsys_WriteErrorLog( "Windows User: "  + GetEnv( "USERNAME" ) )
      Errorsys_WriteErrorLog( "Logon Server: "  + Substr( GetEnv( "LOGONSERVER" ), 2 ) )
      Errorsys_WriteErrorLog( "User Domain: "   + GetEnv( "USERDOMAIN" ) )
      Errorsys_WriteErrorLog( "Harbour: "       + Version() )
      Errorsys_WriteErrorLog( "Compiler: "      + HB_Compiler() )
      Errorsys_WriteErrorLog( "GT: "            + hb_GtInfo( HB_GTI_VERSION ) )
      Errorsys_WriteErrorLog()
      Errorsys_WriteErrorLog()
   ENDIF
   cFileName := "hb_out.log"
   IF ! File( cFileName )
      hFileOutput := fCreate( cFileName, FC_NORMAL )
      fClose( hFileOutput )
   ENDIF

   hFileOutput := fOpen( cFileName, FO_READWRITE )
   fSeek( hFileOutput, 0, FS_END )
   fWrite( hFileOutput, cText + Space(2) + hb_Eol() )
   IF nDetail > 1
      nCont  := 1
      nCont2 := 0
      DO WHILE nCont2 < 5
         IF Empty( ProcName( nCont ) )
            nCont2++
         ELSE
            cText := "Called from " + Trim( ProcName( nCont ) ) + "(" + Ltrim( Str( ProcLine( nCont ) ) ) + ")"
            fWrite( hFileOutput, cText + hb_Eol() )
         ENDIF
         nCont++
      ENDDO
      fWrite( hFileOutput, hb_Eol() )
   ENDIF
   fClose( hFileOutput )

   RETURN NIL

STATIC FUNCTION ArgumentList( e )

   LOCAL xArg, cArguments := ""

   IF ValType( e:Args ) == "A"
      FOR EACH xArg IN e:Args
         cArguments += [(] + Ltrim( Str( xArg:__EnumIndex() ) ) + [) = Tipo: ] + ValType( xArg )
         IF xArg != NIL
            cArguments +=  [ Valor: ] + Alltrim( hb_ValToExp( xArg ) )
         ENDIF
         cArguments += hb_Eol()
      NEXT
   ENDIF

   RETURN cArguments

STATIC FUNCTION ShellExecuteOpen( cFileName, cParameters, cPath, nShow )

   wapi_ShellExecute( Nil, "open", cFileName, cParameters, cPath, hb_DefaultValue( nShow, WIN_SW_SHOWNORMAL ) )

   RETURN Nil
Basicamente salva em disco, mas permite chamar a gravação pra outras coisas.
É interessante a parte de mostrar conteúdo de variáveis, apenas tome cuidado pra não expor senhas.

Uma coisa interessante que uso em FLAGSHIP

Código: Selecionar todos

#ifdef FlagShip
   OldHandler := ErrorBlock()
   ErrorBlock( { | e | JoseQuintasError( e ), iif( OldHandler == Nil, Nil, Eval( OldHandler, e ) ) } )
#endif
A minha entra, e a do flagship continua.
Certos erros, só com as duas juntas.
Com certeza não é a mesma deste post, ainda mais que flagship é linux
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/
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

ErrorSys com erro

Mensagem por leandrolinauer »

Boa tarde.
Vou dar uma estudada na sua versão da errorsys e ver o que pode estar havendo.
Valeu
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Responder