Página 1 de 1

Ajuda pra rotina de erro ref. retorno ADO/MySql

Enviado: 11 Out 2012 13:10
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

Ajuda pra rotina de erro ref. retorno ADO/MySql

Enviado: 11 Out 2012 13:39
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
//-------------------------------------

Ajuda pra rotina de erro ref. retorno ADO/MySql

Enviado: 11 Out 2012 14:15
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.

Ajuda pra rotina de erro ref. retorno ADO/MySql

Enviado: 11 Out 2012 19:56
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.

Ajuda pra rotina de erro ref. retorno ADO/MySql

Enviado: 11 Out 2012 21:04
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> ) )


Ajuda pra rotina de erro ref. retorno ADO/MySql

Enviado: 12 Out 2012 10:53
por JoséQuintas
Era isso mesmo que eu estava procurando. Valeu.