Page 1 of 2

Error al intentar acceder a propiedades de oError

Posted: Thu Aug 30, 2007 12:11 pm
by damosi
Saludos :D,
Estoy intentando capturar errores al evaluar expresiones (variable bvalexp), todo funciona ok salvo cuando intento mostrar o acceder al objeto oError para dar detalles de éste. Dado que este código se ejecuta en un programa CGI que interpreta archivos .hrb y devuelve el resultado como un fichero xml simplemente me llega error 502 y eso es porque no llega la respuesta XML simplemente, el XML no llega a generarse.
Sin embargo si quito el oError:Description el programa funciona como debe, es decir, cuando la expresión dada en bvalexp es incorrecta entra en el bloque de recuperación y si no no entra.

Gracias,

bManejadorerror:={ |oError| Break( oError ) }
...
bUltimoManejador:=ERRORBLOCK(bManejadorError)
BEGIN SEQUENCE
if &(Alltrim(bevalexp))
lfiltrar:=.T.
endif
RECOVER USING oError
cResult:="E"
cMsgErr:=MultiLang("Error:")+oError:Description
MensajeXML(cResult,cMsgErr,"",cContent,"")
RETURN
END SEQUENCE
ERRORBLOCK(bUltimoManejador)

Posted: Thu Aug 30, 2007 1:39 pm
by Antonio Linares
Prueba a cambiarlo así:

cMsgErr:=MultiLang("Error:")+ If( ! Empty( oError:Description ), oError:Description, "" )

Posted: Thu Aug 30, 2007 3:38 pm
by damosi
Antonio gracias por contestar,

no funciona, he probado con otras propiedades como :Severity, y de otras maneras : Str(len(oError)) Valtype(oError) pero parece como si la variable que apunta al objeto no existiese.

He probado a declarar oError como variable local y como estatica pero ...igual no se me ocurren otras pruebas

Posted: Thu Aug 30, 2007 3:39 pm
by damosi
Perdón mi versión de harbour

Harbour Alpha build 45.0 Intl. (Flex)

Posted: Thu Aug 30, 2007 5:11 pm
by Antonio Linares
Modifica el código así para comprobarlo:

cMsgErr:=MultiLang("Error:")+ oError:ClassName()

Posted: Thu Aug 30, 2007 5:30 pm
by damosi
Probado, pero mismo resultado,
¿como comprobar si una variable esta definida?

Posted: Thu Aug 30, 2007 7:17 pm
by Antonio Linares
Que valor te devuelve oError:ClassName() ? "nil" ?

Posted: Thu Aug 30, 2007 7:18 pm
by Antonio Linares
> ¿como comprobar si una variable esta definida?

Type( "nombre_variable" ) == "U"

Ojo: el nombre de la variable entre comillas!

Re: Error al intentar acceder a propiedades de oError

Posted: Thu Aug 30, 2007 10:23 pm
by metaldrummer
damosi wrote:Saludos :D,
Estoy intentando capturar errores al evaluar expresiones (variable bvalexp), todo funciona ok salvo cuando intento mostrar o acceder al objeto oError para dar detalles de éste. Dado que este código se ejecuta en un programa CGI que interpreta archivos .hrb y devuelve el resultado como un fichero xml simplemente me llega error 502 y eso es porque no llega la respuesta XML simplemente, el XML no llega a generarse.
Sin embargo si quito el oError:Description el programa funciona como debe, es decir, cuando la expresión dada en bvalexp es incorrecta entra en el bloque de recuperación y si no no entra.

Gracias,

bManejadorerror:={ |oError| Break( oError ) }
...
bUltimoManejador:=ERRORBLOCK(bManejadorError)
BEGIN SEQUENCE
if &(Alltrim(bevalexp))
lfiltrar:=.T.
endif
RECOVER USING oError
cResult:="E"
cMsgErr:=MultiLang("Error:")+oError:Description
MensajeXML(cResult,cMsgErr,"",cContent,"")
RETURN
END SEQUENCE
ERRORBLOCK(bUltimoManejador)
Y si Intentas con esto?

Code: Select all

TRY
   if &(Alltrim(bevalexp))
      lfiltrar:=.T.
   endif
CATCH oError
   cResult:="E"
   cMsgErr:=MultiLang("Error:")+oError:Description
   MensajeXML(cResult,cMsgErr,"",cContent,"")
   RETURN
END
Saludos
David Lagos S.
Coquimbo-Chile

Posted: Fri Aug 31, 2007 8:00 am
by damosi
Gracias David,

no compila da error de sintaxis creo que try catch solo funciona en xharbour.

Posted: Fri Aug 31, 2007 8:46 am
by damosi
Antonio perdona, me salte tu último post, :lol:
he probado lo que me dijiste y me deja aun más desconcertado pues me devuleve "O" o sea que efectivamente es un objeto.

Posted: Fri Aug 31, 2007 9:28 am
by Antonio Linares
Entonces prueba:

cMsgErr:=MultiLang("Error:")+ oError:ClassName()

y veamos cual es la clase del objeto

Posted: Fri Aug 31, 2007 9:40 am
by damosi
Antonio lo he probado, pero cualquier intento de acceder a
propiedades del objeto produce el error.

He realizado alguna prueba (forzando una expresión con error) quitando el manejador de errores y dejando que el intérprete de hrb (llamado clipxnet) lo maneje, la salida es esta:

Code: Select all

Creacion de archivo, 20070831 11:32:21

********** FECHA: 20070831 11:32:21   Red: LWWB483 **********
Sistema: HClipxNet v0.99
Directorio: C:\Inetpub\wwwroot\
Disco: 59,939,790,848   RAM (KBytes): 125,644   DOS: Windows 2000 5.0.2195 Service Pack 4
Base:   (5) CONGRES    Fecha: 20070827    Reg: 3/40
Indice: (1) CODIGO
Error BASE/1449  Syntax error: &
Llamado por XMLFILTREPORTGEN(2088)
Llamado por CENTRO(451)
Llamado por MAIN(93)
Llamado por __HRBRUN(0)
Llamado por SGHRBRUN(1640)
Llamado por (b)SGBLOCK(2552)
Llamado por SGCGISCRIPT(1390)
Llamado por MAIN(601)
Estoy pensando que quizás David Arturo Macias (autor de clipxnet) haya "tocado algo" para implementar su función de captura de errores, no lo se. por otro lado ¿es posible impedir la lectura de propiedades de un objeto?

Posted: Fri Aug 31, 2007 11:14 am
by Antonio Linares
> Error BASE/1449 Syntax error: &

Eso parece un error en una macro

Posted: Fri Aug 31, 2007 11:23 am
by damosi
Efectivamente, la línea 2088 es :

if &(Alltrim(bevalexp))

donde le paso una expresión a bevalexp que sé va a dar error, para que salte el manejador de errores.

La salida que pegue antes era la que daba clipxnet al capturar el error una vez comentadas las líneas:

//bUltimoManejador:=ERRORBLOCK(bManejadorError)
y
//ERRORBLOCK(bUltimoManejador)