Rotina de ErrorLog

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Rotina de ErrorLog

Mensagem por cjp »

Isto eu entendi, só não entendi por que estaria indicando errado o local do erro com o begin sequence. Isso nunca me ocorreu.

Infelizmente não está não, eu tive que fazer algumas pequenas adaptações para compilar; da forma original, não estava compilando. Tentei baixar de novo, mas o link que vc mandou não está mais abrindo. Poderia mandar novamente?

Testei essa tua última solução no meu errorsys, mas não funcionou, continua fechando direto.

Como faço para saber onde está o erro no meu errorsys?
Inacio de Carvalho Neto
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 ErrorLog

Mensagem por JoséQuintas »

Tive que renomear, pra não atrapalhar a compilação do pacote.
Isso é igual a pasta de HD, então quando acontecer isso, abra a pasta anterior.

https://github.com/JoseQuintas/allgui/t ... ter/common

Pode acontecer do programa encerrar antes de executar o RUN, ou alguma LIB gráfica que não tem console pra mostrar o texto, ou outras coisas mais.
Inclusive erro múltiplo, onde o próprio Harbour grava no hb_out.log.
Por isso indiquei pra olhar o hb_out.log
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Rotina de ErrorLog

Mensagem por cjp »

Tive que fazer as seguintes alterações na tua função para conseguir compilar:

1) troquei STATIC FUNCTION ErrorMessage( e ) por FUNCTION ErrorMessage( e )

2) desabilitei a linha REQUEST HB_GT_WVG_DEFAULT, pois acho que isso requer uma lib que eu não sei qual é.

Continuou fechando direto. Veja a imagem anexa.

O hb_out está assim:

Código: Selecionar todos

Error on 03/23/17 23:57:53
Alias:  
Folder: C:\agenda\
Windows: Windows 8 6.2.9200
Computer Name: INACIO-NOVO
Windows User: Inacio
Logon Server: \INACIO-NOVO
User Domain: Inacio-novo
Harbour: Harbour 3.2.0dev (r1404031226)
Compiler: MinGW GNU C 4.6.1 (32-bit)
GT: WIN



Called from (b)ERRORSYS(29)  
Called from MAIN(7)  

Error BASE/1003  Variable does not exist: AAA
--------------------------------------------------------------------------------

Error on 25/03/17 00:13:23
Alias:  REGISTRO
Folder: C:\agenda\
Windows: Windows 8 6.2.9200
Computer Name: INACIO-NOVO
Windows User: Inacio
Logon Server: \INACIO-NOVO
User Domain: Inacio-novo
Harbour: Harbour 3.2.0dev (r1404031226)
Compiler: MinGW GNU C 4.6.1 (32-bit)
GT: WIN



Called from MAIN(142)  

Application Internal Error - C:\agenda\TAGENDA.exe
Terminated at: 2017-03-25 01:28:54
Unrecoverable error 9998: Harbour terminal (GT) initialization failure
------------------------------------------------------------------------
Não uso lib gráfica.

Como assim o programa encerrar antes de executar o RUN? Que run?
Anexos
Tela.png
Inacio de Carvalho Neto
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 ErrorLog

Mensagem por JoséQuintas »

2) desabilitei a linha REQUEST HB_GT_WVG_DEFAULT, pois acho que isso requer uma lib que eu não sei qual é.
A GTWVG acrescentei porque acaba sendo uma alternativa console em GUI, e o pacotão é pra GUI..
Tem que retirar a função inteira, senão fica sem GT, que é o erro que está acontecendo.

Código: Selecionar todos

PROCEDURE HB_GTSYS()
   REQUEST HB_GT_WVG_DEFAULT
   RETURN
Está aí um ponto interessante:

O último erro não é gerado pela errorsys, é pelo HARBOUR mesmo.
Por default o Harbour já usa hb_out.log pra erros internos e outros do tipo.
Apenas uso o mesmo arquivo, assim os erros ficam todos juntos.

Corrija retirando a função inteira HB_GTSYS().
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 ErrorLog

Mensagem por JoséQuintas »

Só como comentário;

Alterei pra quando não for usada na ALLGUI não exija a GTWVG.

https://github.com/JoseQuintas/allgui/c ... f73a42a46a

Aproveitando:
Se quiser ver como fica O APLICATIVO com GTWVG, é só acrescentar na compilação: GTWVG.HBC
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Rotina de ErrorLog

Mensagem por cjp »

Continua fechando direto nos dois casos. Veja o anexo.
Anexos
Tela.png
Inacio de Carvalho Neto
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 ErrorLog

Mensagem por JoséQuintas »

Mexeu nesta parte?

Código: Selecionar todos

bError := ErrorBlock( {|e| Break(e) } )
   begin sequence
      verarqv("proc2p.exe")
   recover using e
      cMessage := ErrorMessage(e)
   if at("Erro de criação",cMessage)=0
       logerro()
       mandmail1("error.log","Erro na execução dos verarqv contornado com o recover do begin sequence")
   endif
   endsequence
   ErrorBlock( bError )
Aliás... eu deixaria assim:

Código: Selecionar todos

VerArqv( "proc2p.exe" )
E no início do aplicativo:

Código: Selecionar todos

IF File( "hb_out.log" )
  EnviaPorEmail(....)
ENDIF
E no caso de gravar informações adicionais pro log de erro: WriteErrorLog( cTexto, 2 )
Qualquer coisa que for gravada no hb_out.log vai ser enviada por email, sem necessidade de rotinas adicionais.

Como adicional, após enviar email, acumulo tudo num loggeral.log

E basta verificar o hb_out.log, ou esperar email.

Aliás... agora que vi... Break(e) significa que vai prosseguir mesmo com erro.
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Rotina de ErrorLog

Mensagem por cjp »

Não, eu estava testando assim:

Código: Selecionar todos

?aaa
Sem o begin sequence e com o teu último errorsys.

Agora, eu substitui o ?aaa por

Código: Selecionar todos

verarqv("proc2p.exe")
Também sem o begin sequence e com o teu último errorsys.

Curiosamente, não deu nenhum erro.

Daí testei novamente com o begin sequence, assim:

Código: Selecionar todos

bError := ErrorBlock( {|e| Break(e) } )
begin sequence
         verarqv("proc2p.exe")
recover using e
             cMessage := ErrorMessage(e)
             mandmail1("error.log","Erro na função testesdiversos contornado com o recover do begin sequence")
endsequence
ErrorBlock( bError )
Estranhamente, não deu mais erro!!!

Como entender isso?

De qualquer forma, ainda queria fazer meu errorsys voltar a funcionar.

Por favor, dá uma dica de como posso testar ele pra ver onde está o erro. Não dá certo colocar begin sequence dentro do errorsys, né?
Inacio de Carvalho Neto
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 ErrorLog

Mensagem por JoséQuintas »

Código: Selecionar todos

cMessage := ErrorMessage(e)
mandmail1("error.log","Erro na função testesdiversos contornado com o recover do begin sequence")
Desse jeito está pegando a mensagem de erro e enviando por email.
Se não funcionar email, nem fica sabendo que deu erro.

Código: Selecionar todos

Por favor, dá uma dica de como posso testar ele pra ver onde está o erro. Não dá certo colocar begin sequence dentro do errorsys, né?
Nunca tentei, mas talvez seja possível.
Nesse caso talvez uma bem limitada, pra talvez gravar em disco e nada mais, pra evitar maiores problemas.

Uso o BEGIN SEQUENCE em situações bem específicas, pra chamar rotinas extra-aplicativo, que realmente não tem como fazer de outra forma.

Por exemplo:

Código: Selecionar todos

x := win_OleCreateObject( "MSXML2.HTTP" )
Em rotinas do aplicativo, é deixar acontecer o erro, pra poder resolver.

Por exemplo esse ver_arq(). Porque ele dá erro? porque não resolve o erro dele?
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Rotina de ErrorLog

Mensagem por cjp »

Testei agora colocar o begin sequence em 3 pontos da minha errorsys e forçar um erro; compilou sem problema, mas não funcionou, ele continua fechando diretamente, sem dar mensagem de erro.

Daí fiz um outro teste: excluí minha errorsys da compilação; neste caso ele deveria assumir a errorsys padrão, correto? Mas continua também fechando diretamente, sem dar mensagem nenhuma (nem aquela quit / retry padrão da errorsys). Ou eu devo compilar ela junto?

Bom, daí eu desconfio que o problema esteja na minha aplicação principal, não no errorsys. Sendo assim, fiz um teste.prg, apenas com um erro forçado. Compilei só hbmk2 teste.prg. E aí: deu o erro padrão da errorsys.

Próximo passo: testei compilar esse teste.prg com a minha errorsys. Resultado: executou minha errorsys sem problema, informando o erro da maneira como eu queria.

Isso prova que o problema não está na minha errorsys, mas sim na minha aplicação principal, correto? Aparentemente, ela não está executando a minha errorsys, nem errorsys nenhuma.

Como faço para descobrir por que disso?

O problema de deixar acontecer o erro é que os usuários são muito impacientes com isso. Eu prefiro que o sistema me comunique o erro diretamente, sem que o usuário precise sequer saber do erro.

Na função verarqv() não tem erro nenhum, já fiz vários testes. Estava dando erro apenas na chamada a ela, mas estranhamente, o erro sumiu.
Inacio de Carvalho Neto
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 ErrorLog

Mensagem por JoséQuintas »

No meu caso, eu tenho a atualização automática pelo aplicativo.
Ao receber o erro por email, eu corrijo.
Também procuro complementar a mensagem de erro, para o caso de erem problemas do lado do cliente, para que resolvam.
E se por algum motivo o email for bloqueado, o usuário ainda pode me enviar o texto aberto por email.

Com isso, as mensagens de erro vão sumindo, o usuário vai gostar mais ainda.

por coincidência uma mensagem de ontem.
É a mesma que aparece na tela do usuário.
Envio em 27/03/17 - 17:57:51
--------------------------------------------------------------------------------
Verifique as instruções abaixo
Conforme o problema, o próprio responsável da empresa poderá resolvê-lo.
Se for problema no programa, uma nova versão estará disponível com a correção.
Se o email automático falhar, envie esta página por email à JPA.
--------------------------------------------------------------------------------
Alias Does Not Exist
O mais comum é esta mensagem aparecer por erro no programa
Mas pode ocorrer eventualmente, após uma outra mensagem de erro, onde o usuário seleciona a opção 'Default'
Solução: Depende de análise da JPA, podendo ser a correcao no programa

Horário : 27/03/17 17:57:51
--------------------------------------------------------------------------------

Error on 27/03/17 17:57:40
JPA: 2017.01.24.1621
Login JPA: IVAN
Alias: JPPREHIS
Folder: Z:\JPA\
MySQL local: SIM ODBC 3.x
Windows: Windows 7 6.1 SP1
Computer Name: ICG-HP
Windows User: icg
Logon Server: \ICG-HP
User Domain: icg-HP
Harbour: Harbour 3.4.0dev (1fe224d0ff) (2017-01-18 14:55)
Compiler: Microsoft Visual C++ 16.0.40219 (32-bit)
GT: WVG



Error BASE/1002 Alias does not exist: jppreco
Called from DBSELECTAREA(0)
Called from JPPRECOCLASS:HISTORICO(265)
Called from JPPRECOCLASS:USERFUNCTION(67)
Called from JPPRECOCLASS:EXECUTE(330)
Called from PPRE0010(40)
Called from DO(0)
Called from RUNMODULE(109)
Called from BOXMENU(867)
Called from BOXMENU(846)
Called from MENUPRINC(714)
Called from SISTEMA(129)
Called from (b)MAIN(69)

Erro meu.
Criei o temporário do MySql na área atual.
E esqueci de apagar o temporário também... rs

Código: Selecionar todos

   WITH OBJECT cnMySql
      :cSql := "SELECT * FROM JPPREHIS WHERE PHITEM=" + StringSql( jppreco->pcItem ) + " AND PHCADAS=" + StringSql( jppreco->pcCadas ) + ;
         " AND PHFORPAG=" + StringSql( jppreco->pcForPag ) + " ORDER BY PHDATA DESC"
      cTmpFile := :SqlToDbf()
   END WITH
   USE ( cTmpFile ) ALIAS jpprehis // <<============ faltou SELECT 0
   Mensagem( "SETAS Seleciona, INS Insere, DEL Exclui, ESC Sai" )
   dbView( 11, 0, MaxRow() - 6, MaxCol(), oTBrowse, { | b, k | PPRE0010Dig( b, k ) } )
   SELECT jppreco

   RETURN NIL
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Rotina de ErrorLog

Mensagem por cjp »

Nossa, tua mensagem de erro ao usuário é muito complexa e com muitos dados. Meus usuários iriam pirar com isso. São usuários muito básicos, daqueles que não tem conhecimento nenhum de computador e reclamam de tudo (pra vc ter uma ideia, anteontem a internet estava muito lenta, causando problemas de travamento no sistema; não havia nenhuma culpa minha nisso, mas ainda assim recebi muitas reclamações).

Vc poderia me ajudar a tentar achar o erro em minha aplicação que estaria causando não entrar no errorsys? As premissas que eu coloquei antes estão certas?
Inacio de Carvalho Neto
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 ErrorLog

Mensagem por JoséQuintas »

Nossa, tua mensagem de erro ao usuário é muito complexa
Depende do ponto de vista.
Para o usuário seria a primeira parte:
Verifique as instruções abaixo
Conforme o problema, o próprio responsável da empresa poderá resolvê-lo.
Se for problema no programa, uma nova versão estará disponível com a correção.
Se o email automático falhar, envie esta página por email à JPA.
--------------------------------------------------------------------------------
Alias Does Not Exist
O mais comum é esta mensagem aparecer por erro no programa
Mas pode ocorrer eventualmente, após uma outra mensagem de erro, onde o usuário seleciona a opção 'Default'
Solução: Depende de análise da JPA, podendo ser a correcao no programa
E o restante, detalhes do sistema operacional, versão do aplicativo, usuário, máquina, etc. pra ajudar a encontrar o erro.

Comecei a trocar de ODBC 3.51 pra 5.3, do MySql, então é bom EU saber em qual pode estar ocorrendo problema.
Também posso compilar com MSVC ou MINGW, é bom saber se algum poderia causar algo diferente.
Pode ser problema relacionado com sistema operacional, é bom saber o que está sendo usado.
Pode estar rodando dbf, mysql e/ou hbnetio....
E por aí vai.

Na prática nem sei o que está instalado em cada máquina/cliente.
Cada um atualiza o aplicativo quando quiser, e se quiser.
Para eles, é só clicar em atualizar versão e pronto.

Eu apenas vou acrescentando opções/recursos, e deixando pra download.
E sempre colocando no aplicativo pra fazer o que precisa, senão não vou lembrar de alterar estrutura DBF, alterar estrutura MySql, transferir para MySQL, converter dados, e outras coisas mais.
Desse jeito vou sempre em frente, o que era passado já foi, o aplicativo se vira.

Justamente porque cada erro que acontece já resolvo, então se aconteceu problema alguma vez, não acontece mais.

O erro que mencionei, é ao consultar histórico de preços, toda a história de preços de determinado cliente.
Trata-se de uma opção usada eventualmente, então já vai ficar resolvido pra todos.
Em versões anteriores, isso ficava em DBF, mas passou pra MySQL tempos atrás.

Desse jeito, só mesmo colocando as informações na mensagem de erro.... rs
Principalmente a versão do aplicativo: senão vou procurar erro que não existe mais... rs

Ah sim... Desse jeito também, eles sabem exatamente qual informação vém pra mim.
E poderia até enviar cópia pra algum email da empresa.
Se for problema de cabeamento, ou configuracão do servidor, já encaminhariam ao responsável.
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 ErrorLog

Mensagem por JoséQuintas »

Vc poderia me ajudar a tentar achar o erro em minha aplicação que estaria causando não entrar no errorsys? As premissas que eu coloquei antes estão certas?
Usa alguma LIB gráfica?
Usa muito BEGIN SEQUENCE no aplicativo? ou TRY/CATH?
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 ErrorLog

Mensagem por JoséQuintas »

Só pra curiosidade: todos os meus aplicativos são um EXE único.
Aqui tem todo meu uso de begin sequence.
beginsequence.png
No geral, rotinas de MySQL, de internet, FTP, Capicom e MSXML, parte da biblioteca pessoal onde o fonte é ze_*
O resto, se tiver que dar erro, é pra aparecer.
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/
Responder