close Warning: Can't synchronize with repository "(default)" (/var/svn/mms does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 13 years ago

Closed 13 years ago

Last modified 13 years ago

#1004 closed doubt (fixed)

Error al crear NameBlocks que no existen

Reported by: imendez Owned by: Pedro Gea
Priority: major Milestone: Maintenance
Component: General Keywords:
Cc: atorre@…

Description (last modified by Pedro Gea)

Hola, a menudo me encuentro con errores del tipo:

NameBlock est = MMS::Container::GetEstimation_Load(sEstInfo, Repo);
Warning: [20] [@MainContainer$GetObject_Load] No se ha encontrado el objeto 'dd' (Estimation).
ERROR: [26] Fallo en la función "GetObject_Load"

La solución supongo que es hacer primero un Find, pero ¿no se podría hacer que estos métodos hicieran primero el Find y, en caso de no encontrar el objeto, devolviera un NameBlock que indique que no se ha devuelto lo que se esperaba?

Es más, tal vez ya se esté haciendo internamente el Find; en ese caso, sería simplemente cambiar la salida.

Un saludo.

Change History (5)

comment:1 Changed 13 years ago by Pedro Gea

Description: modified (diff)
Milestone: Maintenance
Status: newaccepted
version: 0.6

La situación que comentas es como dices, si una función que devuelve un objeto falla, se muestra un error y no se crea objeto alguno.

Planteas que podría devolverse un NameBlock cualquiera o "por defecto" que represente a la salida fallida, pero en mi opinión eso sólo retrasará los próximos errores, ya que si creas o pides un objeto, no es sino para llamar luego a alguno de sus métodos.

El error no es más que uno del tipo:

Set s = [[ 2, 3 ]];
Real a = s[3];
ERROR: [1] Intento de acceso al elemento 3-esimo de un conjunto de 2 elementos
ERROR: [2] a no se pudo crear.

La solución pasa por comprobar la viabilidad de la llamada con mecanismos del tipo "Find" como comentas o quizá comprobar si la salida se creó o si el número de errores (Real NError) aumentó.

comment:2 Changed 13 years ago by Pedro Gea

Si la intención es poder reconducir un mecanismo o algoritmo sin añadir errores, la idea es, como indicas, usar el método Find.

Habitualmente para cada método GetObject suele haber un FindObject (o HasObject si el atributo es único y opcional) que llamado con esos mismos argumentos te permite saber si la llamada tendrá éxito.

Haciendo de este modo algo como:

Set s = [[ 2, 3 ]];
Real a = If(Card(s)>=3, s[3], ?);

Quizá lo que sería necesario en este ejemplo que planteas es que exista el par MMS::Container::FindEstimation_Load o aumentar ya de por sí las características de este método, para que actúe si no encuentra la estimación ni cargada ni en el repositorio.

comment:3 Changed 13 years ago by Pedro Gea

La versión libre de trazas de error, apoyándose el ejemplo sencillo que tenemos, sería:

Set s = [[ 2, 3 ]];
Real a = {
  Real nError = Copy(NError); // número de errores en este momento
  Real showE = Show(False, "ERROR"); // se evitan trazas de error
  Real a_ = s[3]; // se intenta la llamada susceptible de fallo
  Real Show(showE, "ERROR"); // se restablecen las trazas de error
  If(NError==nError, a_, ?) // si la llamada no produjo errores se devuelve esa salida
};

comment:4 Changed 13 years ago by Pedro Gea

Resolution: fixed
Status: acceptedclosed

comment:5 Changed 13 years ago by imendez

Bueno, lo proponía como una manera de mejorar la eficiencia del código. Supongo que dentro del GetObject_Load se está haciendo un Find, por lo que si previamente el usuario tiene que hacer otro Find pueden ocurrir dos cosas:

  • Que no exista el objeto, en cuyo caso se para la búsqueda sin mayor problema.
  • Que exista el objeto (cosa que supongo que ocurrirá la mayoría de las veces). En este caso, después del Find "del usuario" se llamará a GetObject_Load, que volverá a hacer un Find, lo cual es ineficiente.

Un saludo.

Note: See TracTickets for help on using tickets.