-- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
On 28/07/2010 11:44, Jose Gregoris wrote:
[ . . . ]
Estás errado. No es UN error de codificación. ¡Son varios! Probablemente alguien "mejoró" el método en CRTLibrary y ahora se traga la excepción y te devuelve nil. Ya es feo que el comment sea tan largo. Aparentemente, hay mucho para entender en un método que es muy corto... y no se entiende leyendo el código. Eso es mala señal (aunque entiendo que puede ocurrir en lugares "puente" donde invocás una función externa). Es malo que te diga que levanta una excepción, si en este método no se levanta ni se maneja. Eso quiere decir que el que lo escribió conoce la implementación de lo que está llamando, y sabe que va a tirar una excepción. El problema es que conocía la implementación de ese momento... el comentario y su valiosa info quedan obsoletos en cuanto alguien modifica en otro lado. Otro problema que oscurece el método es el argumento en la expresión anidada de paréntesis. Nosotros aplicamos siempre la "regla de Valloud" en estos casos (perdón, Andrés, pero está en el libro): un argumento de un keyword no puede ir nunca entre paréntesis. Requiere un nombre que aclare qué es. Finalmente, los nombres de los argumentos no aportan suficiente información, que ya tenemos y agiliza la lectura. Rápidamente lo reescribiría así: StdioFileStream >>read: filename text: aBoolean "Access is character based or binary, depending on the <boolean> argument" | handler mode | mode := aBoolean ifTrue: ['rt'] ifFalse: ['rb']. handler := CRTLibrary default fopen: filename mode: mode. handler isNil ifTrue: [ self error: 'File ', filename, ' does not exist' ]. ^self basicNew setStream: handler isText: aBoolean name: filename Ojo, donde puse self error:, eso también es muy malo; ahí hay que generar una excepción apropiada. Saludos --
-- carlos e. ferro | senior
developer |
caesar systems
| see clearly. decide
smarter. [hidden email] | t: +1.281.598.8790
| t: +54.11.4389.0126 | www.caesarsystems.com To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
-- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
On 28/07/2010 18:24, Jose Gregoris wrote:
Ah, no me fijé en eso... sólo me quedé en este método. Pero ¡eso está fuera de Smalltalk!
#error: suele disparar una excepción del tipo más genérico posible, que normalmente no es atrapada ni manejada por nadie, y por default te saca un cartel. Sacar carteles desde un lugar de nivel tan bajo es malo, no tenés idea del contexto de donde fue llamado esto. Por otra parte, la excepción es tan genérica, que perdés un montón de información sobre qué pasó exactamente. Hay que buscar un tipo de excepción específico, algo que sea como FileNotFound, y mandar esa. Así, el sender puede manejarla sin quedar mal. Un "on: Error do:" es grosero, en cambio, poner [ file open ] on; FileNotFound do: [ ... ] suena razonable. Al saber qué error está manejando, se puede hacer algo con sentido en el handler. Saludos --
-- carlos e. ferro | senior
developer |
caesar systems
| see clearly. decide
smarter. [hidden email] | t: +1.281.598.8790
| t: +54.11.4389.0126 | www.caesarsystems.com To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
-- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
On 02/08/2010 11:50, Jose Gregoris wrote:
No hay problema, los emails permiten recuperar los contextos :-) En líneas generales estoy de acuerdo. Y no soy muy partidario de las excepciones dentro del código de la aplicación. Para una posición más extrema (y bien fundamentada) sobre el uso de excepciones dentro del dominio de aplicación, podés preguntarle a Hernán Wilkinson (que sí está en esta lista). Pero en este caso, estamos hablando de artefactos que de por sí ya son de bajo nivel: un stdioFileStream y la librería de base que se conecta al SO. ¿Qué chances tienen esos artefactos de resolver la excepción, aunque se genera en su contexto? NINGUNA. No hay nada interesante que puedan hacer, aunque sí muchas cosas molestas y peligrosas. Si implementara #error: o inclusive fileNotFoundError: en StdioFileStream, lo único que podría hacer es... generar una excepción. Esto es algo que pasa muchas veces: uno puede pensar que el mejor contexto para resolver el problema, es el más cercano. Porque ahí todavía estamos cerca, sabemos exactamente qué pasó y estaríamos en mejores condiciones para resolver las cosas. Todavía no le respondimos nada feo o equivocado a nadie. Pero en realidad, la semántica de la operación suele estar indicada mucho más arriba. En estos casos, claramente es mejor que la excepción la maneje el que pidió las cosas, no el que las está haciendo (que es un "tonto" de bajo nivel). Otro ejemplo clásico del manejo de excepciones: un Float recibe / con cero como argumento. ¿Cómo va a manejar eso? No hay chance. Entiendo que tratar de "adivinar" a partir de una excepción, en otro contexto, cuál fue el problema y cómo solucionarlo es arriesgado. Por eso también enfatizaba que hay que proveer excepciones claras y específicas. Si "desde arriba" se ve un error genérico, los intentos de solución son aventurados o necios, como esos carteles de Windows donde te dice: "Su operación falló; tal vez usted hizo esto o tiene aquello o debería revisar lo de más acá". Ahí se ve que tienen un error genérico, y conocen tres posibles fuentes de ese error...
Seguro... pero eso no dice nada nuevo.
Cierto. Por eso la excepción debería contener suficiente información como para que el manejador adquiera ese conocimiento. No, de ninguna manera. Nunca se pueden prever todos los errores posibles, ni tiene sentido hacerlo. para eso hay manejadores por defecto de las excepciones. Tiene que haber excepciones específicas y relevantes, y el manejador tomará las que considera que es su responsabilidad y capacidad atender. Como cualquier objeto.
Básicamente, porque la copiaron de Smalltalk... Seguro, sería una complicación adicional. pero más para la VM y el administrador de procesos que para el programador. Totalmente en desacuerdo. El manejo de errores tiene que quedar donde hay información para hacerlo, donde se conoce cuál era la intención de la operación y hay una lógica posible para la recuperación. Y si está en el lugar correcto, es parte del comportamiento del objeto y puede ser reusado (rehusar es negarse) tan fácilmente como el resto.
Espero haberlo dejado claro; estoy de acuerdo en algunas cosas y en desacuerdo en muchas otras. De todos modos, te doy una diferencia fundamental: en ese texto, él está hablando en general y sin un ejemplo concreto. Yo sólo me atengo al caso que vos trajiste, un pedazo de código en una clase de stream. Tal vez, en este contexto puntual, su opinión se parezca más a la mía. Para la discusión más general, te recomiendo de nuevo contactar a Hernán, tal vez él tenga algo escrito sobre el uso de excepciones (recuerdo haber visto una clase muy interesante en la materia de la UBA).
No lo sé. A mí me molesta un poco, pero me molestaría más discutirlo en la lista de Smalltalking. Saludos --
-- carlos e. ferro | senior
developer |
caesar systems
| see clearly. decide
smarter. [hidden email] | t: +1.281.598.8790
| t: +54.11.4389.0126 | www.caesarsystems.com To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
-- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
In reply to this post by Jose Gregoris
> Y si está en el lugar correcto, es parte del comportamiento del
> objeto y puede ser reusado (rehusar es negarse) tan fácilmente como > el resto. > > > A que te referís con (rehusar es negarse) ? Me sumo a la lista de los admiradores de Kikote! Quizás por cosas como estas muchos no te contestamos :-) Salud! Guiye -- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
In reply to this post by Jose Gregoris
On 03/08/2010 15:08, Jose Gregoris wrote:
Es que ESA pregunta... Para decirte cómo uso ST, tengo que condensarte un montón de cosas y realmente, no me da para hacerlo en un email. Tendría que escribir un libro, como Andrés... Hay un montón de detalles, que son los que hacen a cómo realmente lo uso. Si te contesto con líneas generales, voy a hablar en el aire y no te voy a decir nada realmente interesante.
Que con el manejo de procesos en paralelo, seguro se agrega un nivel de complejidad. Pero no es un nivel de complejidad del que deba preocuparse el que programa la excepción ni el que programa su manejo. Esa complejidad queda en otro lado. O al menos, eso creo. Habría que ver un ejemplo concreto.
A que Alejandro muchas veces escribe rehusar, no sé si a propósito o no, para lo que otra gente llama reusar (que sería como re-usar, usar más de una vez, en más de un contexto). Pero en castellano, ese verbo existe y tiene un significado preciso, bien definido. Es negarse a algo. Saludos --
-- carlos e. ferro | senior
developer |
caesar systems
| see clearly. decide
smarter. [hidden email] | t: +1.281.598.8790
| t: +54.11.4389.0126 | www.caesarsystems.com To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
In reply to this post by Guillermo Sapaya-2
-- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
Es que para kikote la hache no solo es muda, sino que también invisible!
Kikote ídolo! Esteban A. Maringolo pd: perdón por el off-topic El 3 de agosto de 2010 16:45, Jose Gregoris <[hidden email]> escribió: > > Hola guillote > > epa , si sigue así tendran que cambiar el nombre por elClubDeKiko jajaaj > > saludos > > --- El mar 3-ago-10, Guillermo Sapaya <[hidden email]> escribió: > > De: Guillermo Sapaya <[hidden email]> > Asunto: Re: [clubSmalltalk] StdioFileStream dolphin > Para: [hidden email] > Fecha: martes, 3 de agosto de 2010, 15:18 > > > Y si está en el lugar correcto, es parte del comportamiento del > > objeto y puede ser reusado (rehusar es negarse) tan fácilmente como > > el resto. > > > > > > A que te referís con (rehusar es negarse) ? > > Me sumo a la lista de los admiradores de Kikote! > Quizás por cosas como estas muchos no te contestamos :-) > > Salud! > Guiye -- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
In reply to this post by Jose Gregoris
KiKoTe: (fijate que ya te invente un nick camel case):
Tenés que leer este articulo: Exceptions by Design: ANSI Standard Exception Handling
http://www.cincomsmalltalk.com/userblogs/cincom/digest?content=2001-files-exceptions
-- No se si ya no te lo pase alguna vez. Bueno, a mí me gusta mucho y lo recomiendo a todo el mundo ja, espero no causar tanto daño.
Saludos GallegO El 3 de agosto de 2010 15:08, Jose Gregoris <[hidden email]> escribió:
To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
In reply to this post by Carlos E. Ferro
No es por hinchar, pero acerca de...
> Pero en este caso, estamos hablando de artefactos que de por sí ya son de bajo nivel: un stdioFileStream y la librería de base que se conecta al SO. ¿Qué chances tienen esos artefactos de resolver la excepción, aunque se genera en su contexto? NINGUNA. No hay nada interesante que puedan hacer, aunque sí muchas cosas molestas y peligrosas. tengo un contraejemplo interesante. Con Microsoft nunca se sabe que error tiran funciones como WriteFile(). http://msdn.microsoft.com/en-us/library/aa365747%28VS.85%29.aspx Lo unico que dice la documentacion es "si falla, llama a GetLastError() para ver que paso". Ok, pero cuales de los ~600 errores posibles puede suceder con WriteFile()? Uno de los errores que puede occurrir es ERROR_NO_SYSTEM_RESOURCES, error numero 1450. En ese caso, una excepcion bien puesta te puede resolver el error en la imagen. Basicamente, el tema es que no se puede escribir un archivo por red en bloques de mas de 64mb - 32kb + 16 bytes. Por supuesto, ese limite no esta documentado, asi que el codigo tiene que ir tratando escrituras cada vez mas chicas hasta llegar a 1 byte... grrr... /* * When writing files over the network, the Windows API may fail if the * write block is so large that not enough memory can be allocated to * buffer the write. Unfortunately, using unbuffered writes would either * cause a major slowdown in cases where buffering works, and depending * on the way this is done a 512 byte boundary on read/write amounts and * memory buffer locations may be imposed. To work around this limitation, * [this function] calls itself halving each write until the write succeeds. A * failure to write a single byte is treated as a condition to assume the * write is not possible at all, at which point [this function] fails. The only * error for which this is done is ERROR_NO_SYSTEM_RESOURCES, value 1450. * * For more information, see the following links. * http://support.microsoft.com/kb/913872 * http://support.microsoft.com/kb/99794 * http://msdn.microsoft.com/en-us/library/cc644950(VS.85).aspx * http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx * http://msdn.microsoft.com/en-us/library/aa364439.aspx * */ En los casos en que este codigo tiene que estar en la imagen, esta bueno poner el codigo en el default handler de un exception apropiado porque asi solo hay que escribirlo una vez. Dicho sea de paso, este es otro ejemplo de cosas que estan en una VM, y que no tienen nada que ver con ejecutar bytecodes. Andres. -- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
In reply to this post by Sebastian Calvo
-- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
In reply to this post by Carlos E. Ferro
-- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
In reply to this post by Jose Gregoris
El 4 de agosto de 2010 16:28, Jose Gregoris <[hidden email]> escribió:
No recuerdo haber usado mucho #error: Por lo general, en el nivel que trabajamos diariamente, creamos nuestros propios tipos de Exception (subclase de X). El articulo que te pasé debería ayudarte a entender cómo te conviene modelar tus tipos de Exception.
Saludos GallegO
-- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
In reply to this post by Jose Gregoris
On 04/08/2010 16:36, Jose Gregoris wrote:
Igual, esto solo a es largo... pero va: A grandes rasgos, usamos algo parecido a XP. Pero tenemos un workflow y un montón de prácticas que son particulares de esta organización y difíciles de transportar. Lo más fuerte es que TODO se revisa. No sólo el código y los cambios que hace cada uno, también los documentos que escribimos, las tareas administrativas, los power points que se van a mostrar en algún lado.. todo. Y la revisión es autoría colectiva. El revisor modifica libremente y el autor no se ofende ni se pelea, nadie se encariña con sus ideas. Todo se discute, pero separando lo que es gusto de lo que es objetivo. Para el bug fixing, programamos de manera individual, muchas veces hacemos TDD. Para el desarrollo de cosas nuevas (User Stories) , hacemos discusiones en grupo y ahí hacemos algún diagrama, pero sólo para ese momento y no quedan en ningún lado. También hacemos documentos de especificación a nivel que el usuario pueda validar, sin exponer cómo se implementa. En general, las tasks las hacemos con pair programming. Saludos --
-- carlos e. ferro | senior
developer |
caesar systems
| see clearly. decide
smarter. [hidden email] | t: +1.281.598.8790
| t: +54.11.4389.0126 | www.caesarsystems.com To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
-- To post to this group, send email to [hidden email] To unsubscribe from this group, send email to [hidden email] http://www.clubSmalltalk.org |
Free forum by Nabble | Edit this page |