Ajuda pra rotina de erro ref. retorno ADO/MySql

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra rotina de erro ref. retorno ADO/MySql

Mensagem por JoséQuintas »

Estou usando uma rotina pra ADO e está tudo bem, mas queria que a mensagem de erro contivesse o erro do ADO.
Talvez seja até meio básico, mas não sei como poderia fazer isso - criar uma errorsys pra esse tipo de erro.

Já intercepto erro, pego mensagem de erro do ADO, o que falta é passar isso pra errorsys.
Motivo: envio emails de erro, e o erro que vém é o erro de uso de OLE, e não o erro do MySql.

Como exemplo, a rotina pra conectar com MySql:

Código: Selecionar todos

Function MySqlOpen(cnMySql,lAborta)
Local mAbriu := .f., nCont := 0
lAborta := iif(lAborta==NIL,.t.,lAborta)

wSave(MaxRow()-3,0,MaxRow(),MaxCol())
For nCont = 1 To 5
   Mensagem("Conectando com servidor, tentativa " + Ltrim(Str(nCont)) + "/5")
   Begin Sequence With { |e| Break(e) }
      cnMySql:Open()
      mAbriu := .t.
   End Sequence
   If mAbriu
      Exit
   Endif
   Begin Sequence With {|e| Break(e)}
      Mensagem("Erro:" + Ltrim(Str(cnMySql:Errors(0):Number())) + " " + cnMySql:Errors(0):Description())
      GravaLog("Erro:"+Ltrim(Str(cnMySql:Errors(0):Number()))+" " + cnMySql:Errors(0):Description())
   End Sequence
   MyInkey(10)
Next   
If lAborta .And. .Not. mAbriu
   ?
   ? "Erro abrindo base de dados:"
   Begin Sequence With { |e| Break(e) }
      ? Ltrim(Str(cnMySql:Errors(0):Number())) + " " + cnMySql:Errors(0):Description()
   End Sequence   
   ?
   ? "Nao foi possivel conectar com o servidor."
   ? "Caso seja uma maquina nova, pode faltar instalar o conector para MySql"
   ? "Caso contrario, pode ser por falhas na internet, ou troca do endereco do servidor"
   ? 
   Eval(ErrorBlock())
   Cancel
Endif
wRestore()
Return mAbriu
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Ajuda pra rotina de erro ref. retorno ADO/MySql

Mensagem por alxsts »

Olá!

Você pode passar o objeto erro de uma função para outra, para tratamento local nesta última, através da cláusula THROW. Fiz o exemplo abaixo e funcionou em xHarbour. Verifique no Harbour, pois deve haver tratamento semelhante na sintaxe do Try/Catch/Finally.

Código: Selecionar todos

Function Main()

   Local a := 1, b := 0

   Try
      ? Div( a,b )
   Catch oErr
      ? ( oErr:description )
   End

//-------------------------------------

Function Div( a,b )

   LOCAL nReturn

   Try
      nReturn := ( a/b )
   Catch oErr
      Throw( oErr )
   End

   RETURN nReturn
//-------------------------------------
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra rotina de erro ref. retorno ADO/MySql

Mensagem por JoséQuintas »

O equivalente no Harbour tem na rotina que postei.
Mas estou querendo é o oposto disso.
É pra apresentar o erro, e seguir igual aos outros erros existentes na errorsys, incluindo linha/módulo/etc.

Por exemplo:
Hoje aumentei um texto nos arquivos DBF com informações de log, e esqueci de aumentar no MySql.
O erro era string muito grande pra caber no campo.
Mas pelos emails de erro do sistema, o erro era o mesmo pra quando tem problemas de internet, porque não vém o erro do MySql.
Por isso minha idéia era incluir esse texto na mensagem de erro normal da errorsys.
Mas acho que uma função resolve, dentro ou fora da errorsys, mostrando o texto e depois chamando a errorsys normal.
Assim vou ter o texto, e também a lista de programas/linhas/etc.

É chato aparecer erro do lado do usuário, mas prefiro assim.
Recebendo um erro rápido, resolvo antes que outros atualizem pra versão problemática.
E no caso de hoje, acabei pensando que era problema de internet, porque hoje teve isso - até a TIM saiu do ar, provavelmente problema de conexão entre as operadoras.
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Ajuda pra rotina de erro ref. retorno ADO/MySql

Mensagem por alxsts »

Olá!

Mas você pode criar um objeto erro, de acordo com a sua necessidade, colocando nele as informações do erro recebido do MySQL. Ficaria parecido com isso:

Código: Selecionar todos

   Try
      cnMySql:Open()

      RETURN .T.
   Catch oErr
      // Cria um objeto Error personalizado
      oErr := ErrorNew()

//      oErr:Args          := { Self, xArg }
      oErr:CanDefault    := .F.
      oErr:CanRetry      := .F.
      oErr:CanSubstitute := .T.
      oErr:Description   := cnMySql:Errors(0):Description()   //
      oErr:GenCode       := EG_OPEN
      oErr:Operation     := 'MySql Connect'
      oErr:Severity      := ES_ERROR
      oErr:SubCode       := cnMySql:Errors(0):Number()        //
      oErr:SubSystem     := "BASE"

      RETURN Throw( oErr )
   End
No exemplo que postei, ficaria assim:

Código: Selecionar todos

#include "error.ch"

Function Main()

   Local a := 1, b := 0, oErr//, bError := ErrorBlock( { |e| Break(e) } )

   Try
      ? Div( a,b )
   Catch oErr
      ? "*** Erro em " + oErr:moduleName + " ***"
      ?
      ? "Codigo ", oErr:subsystem + "/" + Ltrim(Str(oErr:subcode)), " Descricao ", ( oErr:description )
      ?
      IF ! Empty(oErr:aaStack)
         Aeval( oErr:aaStack, { |e| QOut( "Chamado de " + e[2] + "(" + Ltrim(Str(e[3] ) ) + ")" ) } )
      ENDIF

   End

   RETURN NIL
//-------------------------------------

Function Div( a,b )

   LOCAL nReturn, oErr

   Try
      nReturn := ( a/b )
   Catch oErr

      // Cria um objeto Error personalizado
      oErr := ErrorNew()
      
      //oErr:Args          := { Self, xArg }
      oErr:CanDefault    := .F.
      oErr:CanRetry      := .F.
      oErr:CanSubstitute := .T.
      oErr:Description   := "Zero Div"   //
      oErr:GenCode       := EG_OPEN
      oErr:Operation     := 'MySql Connect'
      oErr:Severity      := ES_ERROR
      oErr:SubCode       := 5        //
      oErr:SubSystem     := "BASE"

      Throw( oErr )
   End

   RETURN nReturn
//-------------------------------------
Lembrando que este código é xHarbour.
[]´s
Alexandre Santos (AlxSts)
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Ajuda pra rotina de erro ref. retorno ADO/MySql

Mensagem por Imatech »

Para usar em harbour, basta adicionar ao cabeçalho do prg:

Código: Selecionar todos


#xtranslate THROW( <oErr> ) => ( Eval( ErrorBlock(), <oErr> ), Break( <oErr> ) )

M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra rotina de erro ref. retorno ADO/MySql

Mensagem por JoséQuintas »

Era isso mesmo que eu estava procurando. Valeu.
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