https://foro.gambas-es.org/viewtopic.php?f=5&t=454&p=2589#p2589
-----------------------------------
fabianfv
Miercoles, 24 Febrero 2010, 21:38

Re: Control De Errores Global
-----------------------------------
El problema que le veo a este planteamiento es que los errores no persisten en formularios o clases, sino que se propagan únicamente de la rutina que fue llamada a la rutina que la llamó (y esto puede darse en varios niveles de anidamiento), pero no es común ni acertado escribir código que tenga un anidamiento de ese tipo (una rutina que llama a otra, que a la vez llama a una tercera, que llama a una cuarta...)

Aún si alguien escribe su código de ese modo la rutinas que no fueran parte de esos anidamientos no estarían cubiertas.

Para que la idea funcione debería escribirse una clase de inicio (o módulo) que [b]incluya un método puente[/b] y una [b]interfaz de métodos públicos[/b] que llaman al método puente. Éste a su vez deberá llamar al método privado que correponda ([b]interfaz de métodos privados[/b]). [b]El método puente debe contener la sentencia CATH[/b] que trata los errores (directamente o través de otro método).

Ejemplo:


[code linenumbers=false syntax=gambas]
'Clase de inicio

PRIVATE CONST PRIV_METODO_1 AS BYTE =  1
PRIVATE CONST PRIV_METODO_2 AS BYTE =  2
PRIVATE CONST PRIV_METODO_3 AS BYTE =  3

PRIVATE $PropiedadMiembro AS tipo_dato_1

PROPERTY PropiedadMiembro AS tipo_dato_1

PRIVATE FUNCTION PropiedadMiembro_Read () AS tipo_dato_1
  RETURN $PropiedadMiembro
END

PRIVATE SUB PropiedadMiembro_Write (Value AS tipo_dato_1)
  $PropiedadMiembro = Value
END

'********************************
'* Interfaz de métodos públicos *
'********************************

PUBLIC SUB Metodo_1 ()
  MetodoPuente (PRIV_METODO_1)
END

PUBLIC SUB Metodo_2 ()
  MetodoPuente (PRIV_METODO_2)
END

PUBLIC SUB Metodo_3 ()
  MetodoPuente (PRIV_METODO_3)
END

'***********
'* Puente *
'***********

PRIVATE MetodoPuente (arg AS Byte)

  SELECT CASE arg
     CASE PRIV_METODO_1
         PrivMetodo_1
     CASE PRIV_METODO_2
         PrivMetodo_2
     CASE PRIV_METODO_3
         PrivMetodo_3
  END SELECT

  CATCH
     'Hacer algo con el error
END

'********************************
'* Interfaz de métodos privados *
'********************************

PRIVATE SUB PrivMetodo_1 ()
   'Quiero hacer algo útil  
END

PRIVATE SUB PrivMetodo_2 ()
   'Quiero hacer algo útil  
END

PRIVATE SUB PrivMetodo_2 ()
   'Quiero hacer algo útil  
END
[/font]
[/code]

Esto no lo he probado sólo es una deducción lógica que espero sea acertada.

Saludos cordiales.


