Página 2 de 5

Rotina de ErrorLog

Enviado: 25 Mar 2017 00:34
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?

Rotina de ErrorLog

Enviado: 25 Mar 2017 00:58
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

Rotina de ErrorLog

Enviado: 25 Mar 2017 01:36
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?

Rotina de ErrorLog

Enviado: 25 Mar 2017 11:12
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().

Rotina de ErrorLog

Enviado: 25 Mar 2017 11:30
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

Rotina de ErrorLog

Enviado: 25 Mar 2017 13:24
por cjp
Continua fechando direto nos dois casos. Veja o anexo.

Rotina de ErrorLog

Enviado: 25 Mar 2017 14:26
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.

Rotina de ErrorLog

Enviado: 25 Mar 2017 15:01
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é?

Rotina de ErrorLog

Enviado: 28 Mar 2017 09:50
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?

Rotina de ErrorLog

Enviado: 28 Mar 2017 18:11
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.

Rotina de ErrorLog

Enviado: 28 Mar 2017 18:35
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

Rotina de ErrorLog

Enviado: 28 Mar 2017 23:42
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?

Rotina de ErrorLog

Enviado: 29 Mar 2017 01:04
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.

Rotina de ErrorLog

Enviado: 29 Mar 2017 01:08
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?

Rotina de ErrorLog

Enviado: 29 Mar 2017 01:17
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.