In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Como interceptar un error antes de que suceda

Foro público de Xailer en español
Responder
Guillermo Guevara Car
Mensajes: 176
Registrado: Sab Ene 19, 2008 5:52 pm

Como interceptar un error antes de que suceda

Mensaje por Guillermo Guevara Car »

Al estar procesando un bucle For Next, que atrapa y muestra a tavés de un
MsgInfo(), las opciones de menús definidas en una clase TMenu, cominza a
correr y mientras el menú superior tenga un hijo SubMenú me sigue mostrando
las opciones, el problema surge cuando un Item ya no tiene un hijo SubMenú
que dependa del item superior ya que me muestra el siguiente error:
Subsistema: BASE
Código de error: 1004
Estado: .F.
Descripción: Class: 'NIL' has no exported method
Operación: AITEMS
Argumentos: [ 1] = Tipo: U Valor: NIL
Fichero:
Código error SO: 0
La pregunta es: Como hago para interceptar este error antes de que ocurra?
El código que ejecuta el proceso descrito es:
METHOD FormShow( oSender ) CLASS _Menu
//
Local l_oItemH
Local l_cItemH := ''
Local l_nItrH := 1
Local l_nLenH := 0
//
Local l_oItemV
Local l_cItemV := ''
Local l_nItrV := 1
Local l_nLenV := 0
//
Local l_oItemX
Local l_cItemX := ''
Local l_nItrX := 1
Local l_nLenX := 0
//
Local l_nCont := 1
//
l_oItemH := ::oMenu1:aItems
l_nLenH := Len(l_oItemH)
For l_nItrH := 1 to l_nLenH
l_cItemH := l_oItemH[l_nItrH]
MsgInfo('1 '+l_cItemH:cText)
l_nCont++
l_oItemV := l_oItemH[l_nItrH]:oSubMenu:aItems
l_nLenV := Len(l_oItemV)
For l_nItrV := 1 to l_nLenV
l_cItemV := l_oItemV[l_nItrV]
If Empty(l_cItemV:cText)
Loop
EndIf
MsgInfo('2 '+l_cItemV:cText)
l_nCont++
If
Empty(l_oItemH[l_nItrH]:oSubMenu:aItems[l_nItrV]:oSubMenu:aI tems)
MsgInfo('Detectado')
EndIf
l_oItemX :=
l_oItemH[l_nItrH]:oSubMenu:aItems[l_nItrV]:oSubMenu:aItems
l_nLenX := Len(l_oItemX)
For l_nItrX := 1 to l_nLenX
l_cItemX := l_oItemX[l_nItrX]
If Empty(l_cItemX:cText)
Loop
EndIf
MsgInfo('3 '+l_cItemX:cText)
l_nCont++
Next l_nItrX
Next l_nItrV
Next l_nItrH
MsgInfo(l_nCont)
//
RETURN Nil
Gracias
Guillermo Guevara Carrillo
Rene Flores
Mensajes: 620
Registrado: Jue Mar 23, 2006 2:39 am

Como interceptar un error antes de que suceda

Mensaje por Rene Flores »

Guillermo:
Prueba la estructura :
Try
codigo que puede causar el error
Catch oError
Codigo que corrige o intercepta el error
End
Revisa el manual de xHarbour para mas informacion.
Saludos
Rene Flores
http://www.ciber-tec.com
Guevara C. escribió:
> Al estar procesando un bucle For Next, que atrapa y muestra a tavés de un
> MsgInfo(), las opciones de menús definidas en una clase TMenu, cominza a
> correr y mientras el menú superior tenga un hijo SubMenú me sigue mostrando
> las opciones, el problema surge cuando un Item ya no tiene un hijo SubMenú
> que dependa del item superior ya que me muestra el siguiente error:
>
> Subsistema: BASE
> Código de error: 1004
> Estado: .F.
> Descripción: Class: 'NIL' has no exported method
> Operación: AITEMS
> Argumentos: [ 1] = Tipo: U Valor: NIL
> Fichero:
> Código error SO: 0
>
> La pregunta es: Como hago para interceptar este error antes de que ocurra?
>
> El código que ejecuta el proceso descrito es:
>
> METHOD FormShow( oSender ) CLASS _Menu
> //
> Local l_oItemH
> Local l_cItemH := ''
> Local l_nItrH := 1
> Local l_nLenH := 0
> //
> Local l_oItemV
> Local l_cItemV := ''
> Local l_nItrV := 1
> Local l_nLenV := 0
> //
> Local l_oItemX
> Local l_cItemX := ''
> Local l_nItrX := 1
> Local l_nLenX := 0
> //
> Local l_nCont := 1
> //
> l_oItemH := ::oMenu1:aItems
> l_nLenH := Len(l_oItemH)
> For l_nItrH := 1 to l_nLenH
> l_cItemH := l_oItemH[l_nItrH]
> MsgInfo('1 '+l_cItemH:cText)
> l_nCont++
> l_oItemV := l_oItemH[l_nItrH]:oSubMenu:aItems
> l_nLenV := Len(l_oItemV)
> For l_nItrV := 1 to l_nLenV
> l_cItemV := l_oItemV[l_nItrV]
> If Empty(l_cItemV:cText)
> Loop
> EndIf
> MsgInfo('2 '+l_cItemV:cText)
> l_nCont++
> If
> Empty(l_oItemH[l_nItrH]:oSubMenu:aItems[l_nItrV]:oSubMenu:aI tems)
> MsgInfo('Detectado')
> EndIf
> l_oItemX :=
> l_oItemH[l_nItrH]:oSubMenu:aItems[l_nItrV]:oSubMenu:aItems
> l_nLenX := Len(l_oItemX)
> For l_nItrX := 1 to l_nLenX
> l_cItemX := l_oItemX[l_nItrX]
> If Empty(l_cItemX:cText)
> Loop
> EndIf
> MsgInfo('3 '+l_cItemX:cText)
> l_nCont++
> Next l_nItrX
> Next l_nItrV
> Next l_nItrH
> MsgInfo(l_nCont)
> //
> RETURN Nil
>
> Gracias
>
> Guillermo Guevara Carrillo
>
>
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Como interceptar un error antes de que suceda

Mensaje por jfgimenez »

Guillermo,
como te ha dicho René, lo más apropiado para 'capturar' los errores es la
estructura TRY / CATCH / FINALLY / END. No obstante, en este caso concreto
es más sencillo comprobar simplemente si la propiedad oSubmenu es NIL, así:
> l_oItemV := l_oItemH[l_nItrH]:oSubMenu:aItems
IF l_oItemV != Nil
...
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Responder