2008/12/2 Enrique Nieloud <[EMAIL PROTECTED]>

> Hola,
> Hace tiempo que no posteo, pero este tema parece interesante y creo que el
> thread daba para más. Sobre todo porque creo que la discusión no es
> específica de Ruby.
>
> De todas formas no todas las excepciones están para ser manejadas.
>> Muchas tienen que poder pasar para informar que hay algo que no está
>> andando bien (si la conexión a la DB falla, está bien que la excepción
>> salga del backtrace para informarnos que tenemos que chequear el motor
>> de base de datos).
>
>
> Si mal no te entiendo, vos decís que dependiendo del tipo de excepción, tu
> módulo puede optar por comportarse en forma transparente, y dejar pasar la
> exception.
> Yo lo veo un poco al revés, no depende tanto de qué tipo de excepción se
> produzca, sino del contexto en el que se produce, dado que la exepción va a
> interrumpir el flujo secuencial de tu módulo, es probable, que sin importar
> el tipo de excepción, vos tengás que tomar alguna medida para garantizar
> cosas, cerrar conexiónes, liberar algún recurso, etc.
> Está bueno que el Ruby tenga el "ensure", así como otros lenguajes tienen
> el "finally".
> En ese sentido, un caso medio jorobado es el del C++, y perdonen por el
> O.T., pero sirve para mostrar diferencias. No tiene finally, ni nada por el
> estilo, por lo que algunos programadores usan destructores para asegurarse
> de realizar las acciones finales. Ejemplo:
>
> void doSomething(void)
> {
>         Lock();
>         //Do other things
>         Unlock();
> }
>
> Claramente, si dentro de "do other things" sucede algo excepcional, el
> Unlock nunca llega a ejecutarse. Por lo que los de C++ se valen de los
> "destructores" de las clases para tal fin, ejemplo:
>
> class LockManager
> {
>         // Esto que sigue es el constructor de la clase: LockManager
>         LockManager(void)
>         {
>                 Lock(); //realiza el lock en el contructor
>         }
>         // Esto que sigue el destructor de la clase LockManager
>         ~LockManager()
>         {
>                 Unlock(); //realiza el unlock en el destructor
>         }
> }
>
> Entonces doSomething() queda:
>
> void doSomething(void)
> {
>         // acá se está declarando e instanciando la variable lockMgr,
>         // por lo que se está invocando el constructor, y este a su vez
>         // está haciendo el "Lock()"
>
>         LockManager lockMgr;
>
>         //Do other things
>
>         //al finalizar doSomething(), el destructor es invocado en forma
>         //automática por C++, por lo el destructor se encarga de invocar el
> unlock.
> }
>
>
> Sufridito ¿no?, Cabe aclarar, que en C++, pase la excepción que pase (salvo
> que Edenor corte justo antes del destructor), los destructores siempre van a
> ser invocados, es por eso que usan esta técnica.
>
> Queda todavía la pregunta original de Pedro:
>
> Pregunta adicional, los errores funcionales (el usuario mete mal los dedos)
>> deben ser tratados como excepciones?
>> Todo debería ser una excepción? o se simplifica si los errores funcionales
>> (las password no coinciden por ejemplo) son manejados por el código sin
>> excepciones y los técnicos (duplicate key entry) son manejados por
>> excepciones.
>>
>
> Acá creo que un factor que influye mucho es si se va a tener la oportunidad
> o no de atrapar la exepción antes de que reviente en el OS o en el caso de
> las WebApp en el WebServer, en definitiva si se va a poder atrapar la
> excepción antes de que llegue al usuario.
> Por ejemplo, en el caso de la password, probablemente sea una mala idea
> usar exepciones, porque a lo mejor, si estamos cerca de la capa que
> interactúa con el usuario, probablemente la exepción termine siendo mostrada
> en el navegador o aplicación de escritorio, pero si por ejemplo, estamos
> haciendo una librería para manejo de fechas, y ésta provee una función que
> recibe dia mes y año y retorna un tipo-fecha, y el usuario (de la librería,
> no del sistema final) pasa el 99/99/2008, entonces acá sí, yo tiraría una
> excepción.
> En definitiva, mi lógica sería: Al usuario del sistema se le validan y
> restringen lo más posible todos sus inputs, y en todo caso se le informa
> amablemente sobre su error, mientras que al usuario de librerías y
> subsistemas internos, se los trata un poco peor, se les tiran excepciones,
> aún cuando no sean por condiciones excepcionales (disk full, network errors,
> etc.)
>
> saludos,
>
>
> _______________________________________________
> Ruby mailing list
> [email protected]
> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>
>
Que bueno que volviste a postear Enrique se te extrañaba por estos lares

P

-- 
Pedro   Visintin . S o f  t w a r e   A r c h i t e c t
http://www.pedrovisintin.com

Ruby On Rails Argentina. http://blogs.onrails.com.ar

Personal page:
http://www.p-e-t-e-r-p-u-n-k.com.ar

"Todo descontento por aquello que no tenemos parece provenir solamente de
nuestra falta de gratitud por aquello que tenemos"
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a