Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

Problema Con Control De Errores Y Return En Una Función

Problema Con Control De Errores Y Return En Una Función
Artículo
Responder citando    Descargar mensaje  
Mensaje Problema Con Control De Errores Y Return En Una Función 
 
Saludos al foro, aprovechando la cuarentena he retomado gambas y me he encontrado con un problema al que no encuentro una solución elegante.

Me explico, una función que realiza la carga de un componente (treeview, gridview, columnview) a partir de los datos de una base de datos. En el caso de que todo sea correcto retorna TRUE y sino FALSE.
Para controlar errores de programación utilizo Finally-Catch y además una variable boolean para controlar lógica de programa.

La función sería algo parecido a esto:


Private Function CargaTreeView() As Boolean
   'Realiza la carga del TreeView

   Dim hResult As Result
   Dim sSql As String
   Dim bControl As Boolean = True

   'Abrimos base de datos.
   If Not hConn.Opened Then hConn.Open()
   'Sentencia SQL
   sSql = "SELECT * FROM Tabla "
   hResult = hConn.Exec(sSql)

   'Cargamos resultado
   If hResult Then

      'Proceso de carga del control

   Else

      'Si no hay datos no hay carga
      bControl = False

   Endif

Finally
   hConn.Close()
   hResult = Null

   If Error.Code <= 0 Then Return bControl

Catch
   'Control de errores
   Message.Error("Error: " & Error.Text & gb.CrLf & "Módulo: " & Error.Where)
   Return False

End

 


El problema está en que, aunque no haya ningún error de programación dentro de la función, cuando llega a la linea: "If Error.Code <= 0 Then Return bControl" si existe un error heredado.
Viene de un "Try" del control TreeView, con debug obtengo:
     Error: 13: Null object
     Módulo: _TreeView_Item._AddChild.136

No se me ocurre más alternativa que, o bien incluir justo antes del "Finally" un Error.Clear(). Asumiendo que si llega hasta ahí la ejecución no hay error de programación. O parchear el código de los controles para limpiar los errores generados por "Try" y volver a construirlos. Ninguna de las dos me convence al 100%.

Subo una pequeña aplicación donde se ve el problema, tiene un control TreeView a la izquierda donde carga Autonomías-Provincias de España desde una base de datos SQLite. Cuando se selecciona una provincia carga un ColumnView con Poblaciones-Codigos postales-Direcciones. La función de carga del TreeView limpia el error del control antes del "Finally", la función de carga del ColumnView no, por tanto el "return" por defecto es False.

Estoy usando gambas 3.14.3. Cualquier sugerencia es bienvenida y gracias de antemano.
Un saludo. H.

 captura_de_pantalla_2020_04_26_13_20_26

Programa ejemplo:

CodPostal.zip
Descripción: Visualizar Codigos postales 
Descargar
Nombre del archivo: CodPostal.zip
Tamaño: 493.52 KB
Descargado: 94 veces
CodPostal.zip
Descripción: Visualizar Codigos postales 
Descargar
Nombre del archivo: CodPostal.zip
Tamaño: 493.52 KB
Descargado: 94 veces
CodPostal.zip
Descripción: Visualizar Codigos postales 
Descargar
Nombre del archivo: CodPostal.zip
Tamaño: 493.52 KB
Descargado: 94 veces




 
Harpo - Ver perfil del usuario Enviar mensaje privado  
Harpo [ Domingo, 26 Abril 2020, 13:30 ]
 


Problema Con Control De Errores Y Return En Una Función
Comentarios
Responder citando    Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
podrías hacer un video con el error y subirlo?



 
v3ctor - Ver perfil del usuario Enviar mensaje privado  
v3ctor [ Domingo, 26 Abril 2020, 13:35 ]
Responder citando    Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
a ti te sale esta ventana en el error?


 no_hay_datos_para_la_provincia_04

el error lo tira en esta zona:

FMain.CargaColumnView.232: 13: Null object
FMain.CargaColumnView.233: _TreeView_Item._AddChild.136




 
última edición por v3ctor el Domingo, 26 Abril 2020, 13:45; editado 1 vez 
v3ctor - Ver perfil del usuario Enviar mensaje privado  
v3ctor [ Domingo, 26 Abril 2020, 13:43 ]
Responder citando    Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
comenta todo el código de finality, y purga el error que hay primero



 
v3ctor - Ver perfil del usuario Enviar mensaje privado  
v3ctor [ Domingo, 26 Abril 2020, 13:51 ]
Responder citando    Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
comente todas las lineas de finality y tira error: null key

 null_key

arregla eso primero



 
v3ctor - Ver perfil del usuario Enviar mensaje privado  
v3ctor [ Domingo, 26 Abril 2020, 13:56 ]
Responder citando    Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
v3ctor escribió:  
a ti te sale esta ventana en el error?


 no_hay_datos_para_la_provincia_04

el error lo tira en esta zona:

FMain.CargaColumnView.232: 13: Null object
FMain.CargaColumnView.233: _TreeView_Item._AddChild.136


Gracias por tu interés Victor, esa ventana se produce al no devolver nada la función y por tanto toma valor por defecto: False. El mensaje lo lanza el evento Select del Treeview. El error "13: Null object" se produce internamente en el ColumnView, no en el programa ejemplo. Es el problema que señalo, un error que se produce internamente en un control y que "hereda" la aplicación que lo usa.



 
Harpo - Ver perfil del usuario Enviar mensaje privado  
Harpo [ Domingo, 26 Abril 2020, 15:22 ]
Responder citando    Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
v3ctor escribió:  
comente todas las lineas de finality y tira error: null key

 null_key

arregla eso primero


Mis disculpas, hice todas las pruebas con una base de datos completa, para subir el programa tuve que eliminar muchos datos.
Para subsanar el error basta cambiar la linea 144: If hResult then
por:    If hResult.Available Then

Gracias por tu interés!



 
Harpo - Ver perfil del usuario Enviar mensaje privado  
Harpo [ Domingo, 26 Abril 2020, 15:33 ]
Responder citando    Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
Hola Harpo.
El error sucede porque se levanta el evento treeview1_select() antes que el treeview tenga elementos, de ahi el null.
La solución es usar unas banderas, por ejemplo cargado = true una vez que cargaste el treeview y en el evento treeview_select pones un condicional
 IF cargado = true then

Saludos.



 
tincho - Ver perfil del usuario Enviar mensaje privado  
tincho [ Domingo, 26 Abril 2020, 15:50 ]
Responder citando    Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
tincho escribió:  
Hola Harpo.
El error sucede porque se levanta el evento treeview1_select() antes que el treeview tenga elementos, de ahi el null.
La solución es usar unas banderas, por ejemplo cargado = true una vez que cargaste el treeview y en el evento treeview_select pones un condicional
 IF cargado = true then

Saludos.


Hola y gracias por la respuesta.
No veo lo que comentas. El evento TreeView1_Select() se dispara por primera vez al asignar: Key = "*" en el proceso de carga, y en el evento se controla que si TreeView.count = 1 no continue.
He probado a poner una bandera (bCargando = True) y no afecta

Por otro lado el error que existe al final del proceso de carga es: 13 - Null Object. en _TreeView_Item._AddChild.136
En el código fuente del control TreeView:

Public Sub _AddChild(sKey As String)

  If Not $aChildren Then $aChildren = New String[]
  $aChildren.Add(sKey)

  If $aChildren.Count = 1 Then
    Try Inc GetTree()._GetParentItem(Me)._GrandChildren
  Endif

End
 


El error que aparece en mi programa ejemplo viene del "Try" del código fuente anterior en el control TreeView. Probé a depurar el ejemplo que viene el código fuente de gambas y efectivamente da error "Null Object", intenta incrementar el contador de nodos hijos (_GrandChildren) del nodo padre del que estamos insertando (_GetParentItem(Me)) en el TreeView (GetTree()). Y lo hace solo para el primer nodo ($aChildren.Count = 1) que es el nodo Root y no tiene padre. De ahí el nulo. Si se comenta la linea del "Try" el control TreeView funciona perfectamente.

Quizá en este ejemplo se vea más claro que error es del control TreeView.

CargaTreeView.zip
Descripción:  
Descargar
Nombre del archivo: CargaTreeView.zip
Tamaño: 15.05 KB
Descargado: 86 veces
CargaTreeView.zip
Descripción:  
Descargar
Nombre del archivo: CargaTreeView.zip
Tamaño: 15.05 KB
Descargado: 86 veces
CargaTreeView.zip
Descripción:  
Descargar
Nombre del archivo: CargaTreeView.zip
Tamaño: 15.05 KB
Descargado: 86 veces




 
Harpo - Ver perfil del usuario Enviar mensaje privado  
Harpo [ Domingo, 26 Abril 2020, 17:16 ]
Responder citando    Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
Hay que comprobar si hay error (si no es null) antes de poder ver si es > 0.
Public Sub btCargar_Click()

  With TreeView1
    .Add("*", "Nodo Root")
    .Add("Child1", "Hijo 1",, "*")
    .Add("Child1-1", "Sub Hijo 1-1",, "Child1")
    .Add("Child1-2", "Sub Hijo 1-2",, "Child1")
    .Add("Child1-3", "Sub Hijo 1-3",, "Child1")
    .Add("Child1-4", "Sub Hijo 1-4",, "Child1")

    .Add("Child2", "Hijo 2",, "*")
    .Add("Child2-1", "Sub Hijo 2-1",, "Child2")
    .Add("Child2-2", "Sub Hijo 2-2",, "Child2")
    .Add("Child2-3", "Sub Hijo 2-3",, "Child2")
    .Add("Child2-4", "Sub Hijo 2-4",, "Child2")
  End With

Finally
  If Error Then ' Agregue esto a tu código
    If Error.Code > 0 Then
      Message.Info("Error: " & Error.Text & gb.CrLf & "Módulo: " & Error.Where)
    Endif
  Endif ' Agregue esto a tu código

Catch
  Message.Error("Errorx: " & Error.Text & gb.CrLf & "Módulo: " & Error.Where)

End

Public Sub btSalir_Click()

  Me.Close()

End
 

Saludos.



 
tincho - Ver perfil del usuario Enviar mensaje privado  
tincho [ Domingo, 26 Abril 2020, 17:27 ]
Mostrar mensajes anteriores:    
 
Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 



 

cron