#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 )
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
Description: | modified (diff) |
---|---|
Milestone: | → Maintenance |
Status: | new → accepted |
version: | 0.6 |
comment:2 Changed 13 years ago by
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
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
Resolution: | → fixed |
---|---|
Status: | accepted → closed |
comment:5 Changed 13 years ago by
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.
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:
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ó.