Página 1 de 5

Rotina de ErrorLog

Enviado: 06 Jun 2013 15:37
por Hasse
Explico, neste meu programa abre uma tela minúscula no canto superior direito, informando na barra, qual a COM que está sendo lida. No corpo, via label, informa se a porta está ATIVA ou INATIVA. Quando está comunicando, aparecem, no local do texto,, setas do tipo <<<<<<<<<< dinâmicas. Assim que a comunicação termina volta a informação do estada da porta. Veja o código da única janela abaixo:

Código: Selecionar todos

   n_X1     := PRM->PRMLIN                   // Endereços de tela.
   n_Y1     := PRM->PRMCOL
   n_Interv := 200                           // Intervalo entre leituras da Serial.
   *
   DEFINE WINDOW principal AT n_X1, n_Y1 WIDTH 200 HEIGHT 80 ;
      TITLE "JS600 - COM " + c_Porta MAIN ;
      ON INIT Dados_Iniciais( c_Form ) ;
      ON RELEASE { || COM_CLOSE( n_Porta ) }
      *
      @ 12, 15 LABEL label_1 WIDTH 160 HEIGHT 16 ;
         VALUE 'COM ' + c_Porta + " => INATIVA" ;
         FONT 'Times New Roman' SIZE 14
         principal.label_1.fontcolor := RED
         *
      DEFINE TIMER Timer_1 INTERVAL n_Interv ACTION Ctrl_Read()      
      *
   END WINDOW
   ACTIVATE Window principal
O demais é dedicado ao controle de leitura e escrita da porta serial.

Durante os teste de uma rotina de ErrorLog, me deparei com algo estranho: Enquanto em modo janela (DOS) eu consigo gravar as variáveis de memória ativas no momento do erro com:
Save All Like * to ErrorMem
A partir deste arquivo pode-se listar todas as variáveis públicas e de herança, o que facilita muito a identificação do erro.
Quando em modo GUI isto não funciona. Há alguma Função que permita este acesso ?

O trecho abaixo também não funciona em modo GUI, onde identifica o erro, a descrição, o seu tipo, etc..., a linha e o módulo onde ocorreu o erro:

Código: Selecionar todos

         __Error := Padr('Tipo de Mensagem .: ' + oErr:SubSystem(),50 ) + ";" +;
                    Padr('N£mero do Erro ...: ' + StrValue(oErr:SubCode()),50 ) + ";" +;
                    Padr('Descri‡Æo ........: ' + oErr:Description(),50) + ";" +;
                    Padr('Objeto do Erro ...: ' + Upper(oErr:Operation() ),50) + ";" +;
                    Padr('Erro do DOS ......: ' + Strvalue(oErr:OsCode() ),50) + ";" +;
                    Padr('µrea de Trabalho .: ' + StrValue(Select() ),50) + ";" +;
                    Padr('Nome do Arquivo ..: ' + oErr:FileName(),50) + ";" +;
                    Padr('Module Name.... ..: ' + oErr:ModuleName(),50) + ";" +;
                    Padr('M¢dulo .....: ' + Procname(2) + REPLICATE(".",15-LEN(Procname(2))) +;
                         ': Linha... ' + StrValue(Procline(2)),50)
Eu já vi que a GUI oferece uma rotina, um pouco diferente, com menos dados. Existe alguma função que me forneça estes dados ?

No Anexo gravei um arquivo dos dados do ErrorLog para analise.

Rotina de ErrorLog

Enviado: 06 Jun 2013 17:08
por Pablo César
Visto que o seu programa é GUI e não modo console, é necessário entender que quando programamos em GUI, temos objetos, os GETs deixam de existir. Portanto o ErrorSys não é mais utilizado. Imagino que essa sua função que gera o ErrorLog, esteja vinculado com o ErrorSys, não é ?

Notei também por causa do objeto err:, isso é utilizado nas ferramentas de POO (Programação Orientada a Objetos), podem ser semi-POO como no caso do Clipper. Mas a Minigui (Extended e versão 3 da HMG), não são POO. A versão HMG 4, sim por causa do uso do QT. Portanto, você terá que re-escrever a sua função de captar o erro.
Hasse escreveu:Enquanto em modo janela (DOS) eu consigo gravar as variáveis de memória ativas no momento do erro com:
Save All Like * to ErrorMem
A partir deste arquivo pode-se listar todas as variáveis públicas e de herança, o que facilita muito a identificação do erro.
Bom herança ? Acho que não seria o termo apropriado. Mas lembre que o Save to só irá pegar as variáveis Públic e Private, as que são do tipo Local e Static não irá tomar conhecimento.

Na pasta C:\MiniGUI\SAMPLES\BASIC\MyErrorFunc da Extended, vai encontrar um exemplo de manipulação de Erro para GUI.
Hasse escreveu:No Anexo gravei um arquivo dos dados do ErrorLog para analise.
Faltou anexar o arquivo (mas tudo bem para mim, não precisa).

Rotina de ErrorLog

Enviado: 06 Jun 2013 19:11
por Hasse
Perdão pela "pisada na bola" do desvio. No embalo do assunto, nem percebi o acontecido.

Beleza. Vou avaliar e testar esta rotina.

Obrigado.

Rotina de ErrorLog

Enviado: 06 Jun 2013 21:26
por Hasse
Boa noite Pablo.

Encontrei o arquivo \SAMPLES\BASIC\MyErrorFunc\FncMyError.prg, da versão 2.2.2 (extended), que compilado apresenta erro em SET ERRORLOG TO.

Na pasta \SAMPLES\ encontrei o mesmo PRG, da versão 3.1.3, onde tenho as 2 linhas:
cErrorMsg := MyErrorMessage( MyObjError )
/// SET ERRORLOG TO GetStartupFolder() + "\MyErrors.htm"
Observar que a linha do SET ERROLOG está comentada, nesta versão 3.1.3.

Este código, em tempo de execução, em modo GUI, apresenta os erros:
Error BASE/1004 No exported method: SEVERITY
Error BASE/1004 No exported method: SUBSYSTEM
Error BASE/1004 No exported method: SUBCODE
Error BASE/1004 No exported method: DESCRIPTION
Error BASE/1004 No exported method: FILENAME
Error BASE/1004 No exported method: OPERATION
No "FncMyError.Prg" tenho:
cMessage := IIF( oError:severity > ES_WARNING, "Error", "Warning" ) + " "
IF ! HB_ISNUMERIC( oError:subsystem )
IF HB_ISNUMERIC( oError:subCode )
IF ! HB_ISNUMERIC( oError:description )
CASE !Empty( oError:filename )
CASE !Empty( oError:operation )
Vejo que possivelmente o objeto "oError" não exista. Estou certo ?

Como contornar isto ?

Rotina de ErrorLog

Enviado: 20 Mar 2017 15:35
por cjp
Estou ressuscitando este post pois estava pesquisando o erro BASE/1004 Método não exportado: SEVERITY, e encontrei aqui referência a ele.

Comecei a receber este erro recentemente numa função que antes não dava erro.

Observo que uso modo console, não uso minigui.

Alguém poderia me explicar o que significa este erro?

Rotina de ErrorLog

Enviado: 20 Mar 2017 18:42
por JoséQuintas
Veja o fonte e linha onde foi indicado erro.
Só essa mensagem não é suficiente pra saber alguma coisa.
Acredito que talvez esteja usando uma errorsys diferente, se o erro for na errorsys.

Rotina de ErrorLog

Enviado: 20 Mar 2017 23:11
por cjp
Sim, a linha do erro é:

Código: Selecionar todos

verarqv("proc2p.exe")


Já conferir que o arquivo não está na função verarqv, está na chamada a ela.

Sim, eu uso o meu próprio errorsys, mas isso influi? O erro estaria no meu errorsys? Mas ele funciona normalmente em todos os casos.

Rotina de ErrorLog

Enviado: 21 Mar 2017 08:53
por JoséQuintas
Com toda certeza, a linha do erro não é essa.

Rotina de ErrorLog

Enviado: 21 Mar 2017 10:00
por JoséQuintas
Desculpe, esqueci do principal: estamos no tópico de minigui.

Boa oportunidade pra testar minha errorsys.
Se a minigui deixar talvez veja o erro real com ela..

Rotina de ErrorLog

Enviado: 21 Mar 2017 15:18
por cjp
Eu também acho estranho esse erro nessa linha, não faz sentido, mas é nessa linha que está apontando o erro. E já fiz vários testes na própria função verarqv(), não é lá.

Como posso testar o teu errorsys? Ou vc quer testar aí?

Rotina de ErrorLog

Enviado: 21 Mar 2017 15:53
por JoséQuintas

Rotina de ErrorLog

Enviado: 21 Mar 2017 17:01
por cjp
Uma dúvida: essa teu errorsys só funciona na minigui? Eu não uso minigui.

Mas ainda não entendi como o erro pode ser no errorsys. É possível isso?

Mesmo sem o meu errorsys, veja, testei assim:

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 )
E está apontando erro justamente na linha verarqv("proc2p.exe").

Rotina de ErrorLog

Enviado: 21 Mar 2017 19:34
por JoséQuintas
É óbvio que assim mostra essa linha.
Isso é justamente pra esconder mensagens de erro.

Minha errorsys é pra qualquer coisa, de console a GUI.

Rotina de ErrorLog

Enviado: 24 Mar 2017 00:06
por cjp
Não sei se te entendi bem, pois eu sempre usei o recover para evitar erros, mas ele sempre me enviou o local correto do erro.

Estou há 2 dias testando a tua errorsys, mas estou tendo problema.

Quando testo com um programa simples assim:

Código: Selecionar todos

function main
cls
?"3"
inkey(1)
?aaa
inkey(1)
?"5"
inkey(1)
return
Ela funciona, dá erro na linha 5, variável aaa inexiste.

Entretanto, quando testo no meu sistema, nem entra na errorsys, o programa fecha direto, sem qualquer mensagem de erro.

Detalhe: com a minha errorsys acontece a mesma coisa.

Imagino que tenha alguma coisa no meu sistema que esteja impedindo a errorsys de funcionar. Mas o que seria?

Estou compilando assim:

Código: Selecionar todos

# coloque aqui suas libs, precedidas pela letra "l" (minúscula):
-lxhb
-lhbwin
-lhbtip
-lhbct
-lhbHPdf
-lhbZebra
-lhbmisc
-llibmysql
rddsql.hbc 
sddodbc.hbc
hbwin.hbc

# coloque aqui os parâmetros de compilação:
-quiet
-jobs=4
-oTAGENDA

# coloque aqui seus arquivos PRGs:
\prg\TAGENDA.PRG
\prg\AGTEL.PRG
\prg\COMUNS.PRG
\prg\CONTAG.PRG
\prg\BANCO.PRG
\prg\AGCOM.PRG
\prg\ERRORS3.PRG
\prg\GETSYS.PRG
\prg\MANUTENCAO.PRG
Onde errors3.prg é a tua errorsys.

Rotina de ErrorLog

Enviado: 24 Mar 2017 01:34
por JoséQuintas
Quando você usa BEGIN SEQUENCE, tá trocando a errorsys padrão por outra.
Se a minha errorsys ainda está original, faça um teste trocando logerro() por WriteErrorLog( cMessage, 2 )
e mandmail1("hb_out.log","Erro na execução dos verarqv contornado com o recover do begin sequence")