Clipper On Line • Ver Tópico - ErrorLog II

ErrorLog II

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

ErrorLog II

Mensagempor Hasse » 29 Mar 2014 23:08

Boa noite colegas.

Após o desenvolvimento parcial do ErrorLog tratado no tópico ErrorLog - Captura de Variáveis, estou tentando adaptar ele a um aplicativo de leitura de Porta Serial, que já está funcionando em MiniGui com o ErrorLog padrão da MiniGui. Este ErrorLog foi baseado no código publicado pelo colega Adalberto del Rosario.

Digo parcial porque o MyErrorLog() em desenvolvimento está em fase bem adiantada, faltando somente terminar a rotina de captura das variáveis que ainda está com problemas e parada.

Enquanto não aparecerem novas idéias, estou tentando adaptar o MyErrorLog() ao aplicativo mencionado no primeiro parágrafo.

Mas o MyErroLog() não funciona, ou seja, a MiniGui continua a gravar o erro no ErrorLog padrão da MiniGui, e não grava no arquivo definido na linha 46 da Função MyErroFunc.prg.

Para análise dos colegas estou anexando o código abaixo.

Main()
*
#include "hmg.ch"
#Include 'Inkey.Ch'
#include "MiniGUI.ch"
*
REQUEST HB_GT_WIN_DEFAULT              // Janela DOS - Temporário para testes.
*
#includes diversos
*
*==================================================================================================
FUNCTION Main()
   *
   * procedimentos iniciais.....
   *
   n_Porta   := PRM->PRMCOM
   c_Porta   := ALLTRIM( STR( PRM->PRMCOM ) )
   n_Baud    := PRM->PRMBRT
   n_DtBit   := PRM->PRMDTB
   c_Prty    := PRM->PRMPRT
   n_StpBt   := PRM->PRMSTB
   n_X1      := PRM->PRMLIN                   // Endereços de tela.
   n_Y1      := PRM->PRMCOL
   n_Lrg     := PRM->PRMLRG                   // Medidas da janela.
   n_Alt     := PRM->PRMALT
   n_Size    := 1024                          // Tamalnho do Buffer.
   n_Interv  := 100                           // Intervalo entre leituras da Porta Serial.
   *
   DEFINE WINDOW principal AT n_X1, n_Y1 WIDTH n_Lrg HEIGHT n_Alt ;
      TITLE "HS611 - 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
   *
RETURN( NIL )
*
*
*
*==================================================================================================
FUNCTION InitError( c_Form )
   *
   LOCAL oErrAntes, oErr                  // oErrorAntes = Para almacenar el ErrorBlock Anterior
   LOCAL lMyError := .F.                  // lMyError = .t. - Si ocurrio realmente un error, .f. - para controlar los BREAK
   *
   oErrAntes := ERRORBLOCK( { | objErr | BREAK( objErr ) } )
   *
   BEGIN SEQUENCE
      *
      * NIL
      *
   RECOVER USING oErr
      *
      IF oErr <> NIL
         lMyError := .T.                  // Especifica que realmente ocurreu um erro.
         MyErrorFunc( oErr )
      ENDIF
      *
   END
   *
   ERRORBLOCK( oErrAntes )
   *
   IF lMyError
      MsgBox( "Ocorreu um erro e o sistema não pode completar a operação", "Error" )
   ENDIF
   *
RETURN( NIL )
*
*
*==================================================================================================
*                  Função de leitura da Porta Serial e gravação dos dados.
*--------------------------------------------------------------------------------------------------
FUNCTION Ctrl_Read( hwnd )
   *
   Liga_Timer( "PARAR" )                                             // Para a contagem de tempo.
   *
   *
   *  aqui rotina principal.
   *
   *
   *
   Liga_Timer( "INICIAR" )                                           // Re-inicia a contagem de tempo.
   *
RETURN( NIL )
FrmWinHS.fmg
DEFINE WINDOW Principal AT n_X1, n_Y1 WIDTH n_Lrg HEIGHT n_Alt ;
   TITLE "HS611 - COM " + c_Porta MAIN ;
   ON INIT { || InitError() } ;
   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

MyErrorFunc.prg
*****
* Manejo de Errores
* Extraido de ErrorSys.prg
* Adalberto del Rosario
*****
*
#include <minigui.ch>
#include "error.ch"
#include "FileIO.ch"
*
#define CRLF         CHR(13) + CHR(10)
*
*--------------------------------------------------------------------------------------------------
FUNCTION MyErrorFunc( MyObjError )
   *
   LOCAL cErrorMsg, HtmArch, cText, i := 2
   *
   cErrorMsg := MyErrorMessage( MyObjError )
   *
   HtmArch := Html_ErrorLog()
   Html_LineText( HtmArch, '<p class="updated">Date: ' + Dtoc(Date()) + "  " + "Time: " + Time() )
   Html_LineText( HtmArch, cErrorMsg + "</p>" )
   *
   cErrorMsg += CRLF + CRLF
   *
   WHILE ! Empty( ProcName( i ) )
      cText := "Called from " + ProcName( i ) + "(" + AllTrim( Str( ProcLine( i++ ) ) ) + ")" + CRLF
      cErrorMsg += cText
   ENDDO
   *
   MsgStop( cErrorMsg, 'Program Error...Ivo' )
   *
RETURN .T.
*
*
*--------------------------------------------------------------------------------------------------
STATIC FUNCTION MyErrorMessage( oError )
   *
   LOCAL c_Message, c_ScrnMsg, cVarName
   LOCAL n_WorkArea := Select()
   *
   *------------------------------------ Gerar nome do LogFile ------------------------------------
   I := 0
   WHILE .T.
      I ++
      c_LogFile := "ERRORLOG_" + STRZERO( I, 03 ) + '.txt'
      IF ! FILE( c_LogFile )
         EXIT
      EndIf
   ENDDO
   *-----------------------------------------------------------------------------------------------
   *  Aqui seguem as Informações:
   *  Tipo do erro, Número do erro, Descrição do Erro, Nome do Arquivo em uso aberto,
   *  Posição do registro do arquivo.
   *  Objeto do erro.
   *  Trace do erro.
   *  Variáveis ativas e seus conteúdos - FALTANDO.
   *  Disco, Diretório, Data, Hora, Memória Livre, Memória Disponível.
   *  SET's ativos.
   *  Informações de todos os arquivos DBF e CDX abertos, Índices ativos, Chaves dos índices, Relações ativas.
   *
RETURN( NIL )


Onde está o erro ?
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 815
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 24 vezes

ErrorLog II

Mensagempor Hasse » 31 Mar 2014 09:13

Bom dia colegas.

Foi um final-de-semana trabalhado, e consegui fazer funcionar o sistema do ErrorLog.

Acontece que quando há um erro qualquer no código da FUNCTION MyErrorMessage() o aplicativo todo "trava", ficando muito trabalhoso o seu debug. Eu acredito que recompilei o aplicativo mais de 500 vezes, sem medo de errar neste número. Os error foram encontrado na base da "tentativa, correção e nova tentativa". Aquela parte da recuperação das variáveis foi o "bicho" para acertar...

É evidente que há uma falha no meu código, mas não sei nem por onde iniciar. Quem sabe um dos colegas faria uma análise do código que estou divulgando abaixo e me dá algumas orientações. Eu penso que o erro deve estar na Função MyErrorFunc()

Depois que o MyErrorMessage() foi totalmente debugado, funciona muito bem, pelo menos me atende em todos os requisitos. Para torná-lo perfeito, falta somente uma cópia da tela no momento do erro, mas isto também não é tão importante assim, mas ajudaria em algumas situações.

FUNCTION Main()
   *
   PUBLIC oERR := ERRORBLOCK( { | oERROR | MyErrorFunc( oERROR ) } )
   *
   Seta variáveis e SET's
   REQUEST's
   Abre os arquivos DBF
   *
   LOAD WINDOW FrmWinHS
   *
   ACTIVATE Window principal
   *
RETURN( NIL )


DEFINE WINDOW Principal AT n_X1, n_Y1 WIDTH n_Lrg HEIGHT n_Alt ;
   TITLE "HS611 - COM " + c_Porta MAIN ;
   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

Acredito que o erro está neste código abaixo... Nele tem algumas linhas que não entendo e nem sei para que servem.
Como:
oErrAntes := ERRORBLOCK( { | objErr | BREAK( objErr ) } ),
ERRORBLOCK( oErrAntes ).
Não sei porque há 2 vezes a chamada cErrorMsg := MyErrorMessage( MyObjError ) dentro do BEGUIN SEQUENCE / END
FUNCTION MyErrorFunc( MyObjError )
   *
   LOCAL cErrorMsg, HtmArch, cText, nn1 := 2
   *
   Liga_Timer( "PARAR" )                                             // Para a contagem de tempo.
   *
   oErrAntes := ERRORBLOCK( { | objErr | BREAK( objErr ) } )
   *
   BEGIN SEQUENCE
      *
      * NIL
      cErrorMsg := MyErrorMessage( MyObjError )
      *
   RECOVER USING oErr
      *
      IF oErr <> NIL
         lMyError := .T.                  // Especifica que realmente ocurreu um erro.
         c_MsgErr := "Passou pelo RECOVER USING"
         cErrorMsg := MyErrorMessage( MyObjError, c_MsgErr )
      ENDIF
      *
   END
   *
   ERRORBLOCK( oErrAntes )
   *
   HtmArch := Html_ErrorLog()
   Html_LineText( HtmArch, '<p class="updated">Date: ' + Dtoc(Date()) + "  " + "Time: " + Time() )
   Html_LineText( HtmArch, cErrorMsg + "</p>" )
   *
   cErrorMsg += CRLF + CRLF
   *
   WHILE ! Empty( ProcName( nn1 ) )
      cText := "Called from " + ProcName( nn1 ) + "(" + AllTrim( Str( ProcLine( nn1++ ) ) ) + ")" + CRLF
      cErrorMsg += cText
   ENDDO
   *
   MsgStop( cErrorMsg, 'Program Error...Ivo' )
   *
   Release Window Principal
   *
RETURN .T.


STATIC FUNCTION MyErrorMessage( oError, c_Message )
   *
   LOCAL c_ScrnMsg, cVarName
   LOCAL n_WorkArea := Select()
   *
   *------------------------------------ Gerar nome do LogFile ------------------------------------
   n_LogNum := 0
   WHILE .T.
      n_LogNum ++
      c_LogFile := "ERRORLOG_" + STRZERO( n_LogNum, 03 ) + '.txt'
      IF ! FILE( c_LogFile )
         EXIT
      EndIf
   ENDDO
   *-----------------------------------------------------------------------------------------------
   *


Realmente eu apreciaria muito os comentários e orientações dos colegas experientes em MiniGui.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 815
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 24 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro