Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-07-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Gracias yusnerqui por el artículo que has enlazado. Por él me he decidido a usar la función "TryStrToInt" en lugar de:

Código Delphi [-]
 var
   i: integer;
begin
   try
     i := StrToInt(cbLinea.Text);
   except
   end;
 end;

Cita:
Empezado por mamcx
Y como sabe el usuario que es un numero?
Hombre, pues porque el formulario es de 40x40 píxeles, hay un único ComboBox y el Caption del formulario es "Número de línea". Por si fuera poco el ComboBox se llena automáticamente con las líneas disponibles y muestra por defecto la línea actual.

Cita:
Empezado por mamcx
Ahora analiza la opcion desde el punto de vista del usuario.... que GARANTIZA que va a saber que hacer? Si no saca un mensje, lo mas seguro es que se puede suponer, el campo es opcional, no obligatorio.
Por eso dije arriba "en este caso" y frases parecidas: en este caso no hay más campos, solamente hay un ComboBox que pide el número de línea a que se quiere uno dirigir: el usuario mismo eligió del "menú" la opción "Ir al número de línea..." ¿Cómo voy a pensar que no sabe lo que quiere hacer, repito, en este caso? ¿Tan complicado es? No, por cierto.

Cita:
Empezado por mamcx
Y esas si son soluciones. De lo contrario, llamara el usuario a preguntar que es lo que pasa o se quedara dando vueltas al asunto adivinando el comportamiento oculto del sistema....
Soy partidario de no tratar al usuario como a tonto, empero, sí mostrarle los mensajes de errores que sean menester e indicarle incluso la forma de hacer las cosas "un tanto rebuscadas".

Mira, podría hacer algo así: mostrar el formulario con un único ComboBox en el que el usuario tuviera que escribir el número de la línea a la que quiere llegar.

Si el número fuera correcto, estupendo, adelante. Si no fuera un número u ocurriera un error de tipo "EConvertError" volverle a mostrar el formulario y en una "etiqueta" informarle de que es un número lo que tiene que indicar y no otra cosa.

Sin embargo, en este caso, insisto, no veo la necesidad: no creo que sea tan complicado lo que se pretende hacer, creo que el usuario lo entiende perfectamente, no se trata de ningún punto "crítico" del programa que pudiera tener consecuencias catastróficas, en fin.

Y, por cierto, no hay plan B en este caso: no hay para qué. ¿Qué sé yo a la línea que se quiere dirigir el usuario? No lo sé, por lo tanto, dejaré las cosas como están.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 15-07-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Yo voy de acuerdo con mamcx. Las excepciones jamás se deben esconder. Pero esto no significa, como dice mi amigo jachguate, que todas deban llegar a oídos (u ojos) del usuario. "tratar la exepción" no es sinónimo de mostrar un mensaje.

Por otra parte es también un error presuponer, como ya lo indicó mamcx que el código va a fallar por una sola posible causa. Para algo está la construcción:

Código Delphi [-]
try

except
  on EErrorQueSeComoManejar do
  begin
  end;
end;

cualquier otro error que no sepamos o podamos manejar o que ni siquiera tengamos previsto debemos dejar que se propague.

También, sin ánimo de ofender, creo que al amigo dec le hace falta enfrentarse con usuarios de verdad. Es increible la cantidad de cosas obvias que algunos simplemente no entienden. No es tanto tratar al usuario como tonto, pero la aplicación si debe estar pensada para tontos.

Cita:
Empezado por dec
Imagina que al usuario le da por escribir un caracter en lugar de un número en el ComboBox. ¿Para qué mostrarle el error? ¿es que no es evidente? ¿es que el usuario no ve por sus propios ojos que una línea se representa mediante su número y no una letra u otro caracter?
¿Cuántas veces no nos hemos detenido nosostros mismos al programar, a veces durante horas, frente a un error que no entendemos. Vemos una y otra vez la ventana de código y nada, no nos iluminamos. Hasta después de un rato o un descanso, nos damos cuenta de lo obvio del error. ¿Por qué ha de ser distinta la situación del usuario?

Yo, como usuario, agradecería una notificación inmediata de lo que estoy haciendo mal para no perder mi tiempo buscando en el formulario dónde está el error.

// Saludos
Responder Con Cita
  #3  
Antiguo 15-07-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por roman
También, sin ánimo de ofender, creo que al amigo dec le hace falta enfrentarse con usuarios de verdad.
No solo no ofendes en absoluto roman, es que, en eso, desde luego, no voy a quitarte la razón.

Cita:
Empezado por roman
Es increible la cantidad de cosas obvias que algunos simplemente no entienden.
¿Puedes indicar algunas de ellas por ver si de una vez por todas puedo entenderlas? Estoy seguro de que son muchas las obviedades que se me escapan, pero no me parece mal que me las hagan saber.

Cita:
Empezado por roman
¿Cuántas veces no nos hemos detenido nosostros mismos al programar, a veces durante horas, frente a un error que no entendemos. Vemos una y otra vez la ventana de código y nada, no nos iluminamos. Hasta después de un rato o un descanso, nos damos cuenta de lo obvio del error. ¿Por qué ha de ser distinta la situación del usuario?
Porque en este caso lo veo más sencillo así. Enfatizo: en este caso. Naturalmente que está bien hacer saber al usuario, si es menester, los errores de los programas, pero, en este caso, simplemente, no lo veo menester.

Recuerdo el caso: el usuario quiere ir a una línea. El usuario elige del menú la opción para ir a una línea. El usuario se encuentra con un formulario de 40x40 píxeles cuyo título es "número de línea" y que solo contiene un ComboBox que ya tiene cargadas todas las líneas disponibles y muestra la actual. El usuario escribe su nombre... Pues se cierra el formulario y santas pascuas.

El usuario vuelve a abrir el formulario, esto es, vuelve a abrir el menú, selecciona la opción oportuna y se le muestra el mismo formulario de antes. Entonces el usuario escribe un número de línea o elige una y zas, se cierra el formulario y se le muestra el número de línea elegido.

Al cabo me convencen y pongo un mensaje de error, en caso de que el usuario escriba su nombre o cualquier cosa que no sea un número de línea, y le digo: ¿no querías ir a un número de línea en concreto? ¿entonces para qué escribes tu nombre? Por favor, escribe o elige la línea a la que quieras dirigirte.

En fin. Yo creo que aquí el tema no era este en absoluto, pues al cabo todo queda reducido a cómo me parece a mí esto y cómo me parece a mí lo otro. Inicié este Hilo con la sola intención de dar noticia del artículo de Ian Marteens el cual me puso de una vez claro el uso de try/except.

Eso sí creo que no se puede discutir, aunque, leyendo el artículo que antes recomendó un compañero que también trata sobre el tratamiento de excepciones, a lo que parece, es un tema sobre el que sí se puede discutir y se lleva discutiendo no poco tiempo.

No sé. Se me ocurre que acaso llegamos a un punto en que tratamos de cierto estilo de hacer las cosas, y esto, ¿quién puede medirlo? Quiero decir, ¿quién puede dar una guía de estilo para esto? ¿No se ve cómo se lee la guía de estilo de estos propios foros? Es probable que sirva de algo, evidentemente sirve, pero, ¿no sigue habiendo otras maneras de hacer las cosas de todos modos?

Y no de hacer las cosas mal, porque puede uno saltarse a veces ciertas reglas para hacer las cosas bien, o como cree que están bien. Pero, bueno, esto ya es demasiado, menudo rollo que he soltado.

Ahora, roman, por favor, hazme saber alguna de esas "cosas obvias que algunos simplemente no entienden". Gracias.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 15-07-2005 a las 20:46:05. Razón: corrección del texto
Responder Con Cita
  #4  
Antiguo 15-07-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 24
ContraVeneno Va por buen camino
Cosas que he aprendido hoy:

+ Todas las entradas que haga el usuario son culpables hasta que se demuestre lo contrario.
+ Controla todo lo que puedas controlar con los controles (si no quieres letras, pon un control que no acepte letras )
+ Controla solo los errores que sepas/puedas controlar. (me queda muy claro la excepción EErrorQueSeComoManejar )
+ El usuario no es tonto, pero el programa debe estar diseñado para tontos.
+ Al usuario le gusta saber cuando hizo algo mal. (En algunos casos será necesario mostrar un mensaje, en otros casos con un BIP es suficiente; pero SIEMPRE indicarle al usuario que algo no resulto como debería).

Tengo la confianza de que gracias a su ayuda y colaboración, seguiré aprendiendo. Gracias a todos.
__________________

Responder Con Cita
  #5  
Antiguo 15-07-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
¿Puedes indicar algunas de ellas por ver si de una vez por todas puedo entenderlas? Estoy seguro de que son muchas las obviedades que se me escapan, pero no me parece mal que me las hagan saber.
Un par de ejemplos:

Problema: El usuario no puede entrar al sistema, le dice que los datos son incorrectos; su hijo- que sabe computación -dice que el sistema está mal hecho.

Razón: en el recuadro que dice:

Escriba se fecha de nacimiento (dd-mm-aaaa)

el usuario escribe 1983/05/31

(¿Qué no es obvio? ¡Le estoy indicando el formato de la fecha!)

Conclusión: (desafortunadamente) el hijo tiene razón

Solución: antes de mandar los datos al servidor, verificar el formato y mandar un mensaje pertinente en caso de que sea incorrecto.

Problema: El alumno no pudo inscribirse, el sistema nunca le presentó el comprobante.

Razón: El alumno cerró la ventana con el resumen de datos sin oprimir el botón que decía:

"Para terminar su inscripción imprima su comprobante"

Claro que estos errores no encajan directamente con las excepciones (de hecho el del combo tampoco), pero son verídicos y muestran el tipo de cosas que podemos dar por obvias y qe el usuario no las ve.

Y el que sea un formulario de 40x40 no es pretexto. ¿Te imaginas qué pasaría si en un código de apenas unas cuantas líneas, el compilador no tuviera a bien decirnos: "Missing operator or semicolon" ¿Es obvio que los parámetros de una función deben ir separados por comas!

Pero de cualquier forma, una construcción como

Código Delphi [-]
try
...
except
end;

jamás debe hacerse. Me parece que ya lo dijo mamcx; al hacer esto escondes todas las excepciones posibles, no sólo las que uno prevee o piensa que pueden suceder.

Cita:
Empezado por dec
El usuario vuelve a abrir el formulario, esto es, vuelve a abrir el menú, selecciona la opción oportuna y se le muestra el mismo formulario de antes. Entonces el usuario escribe un número de línea o elige una y zas, se cierra el formulario y se le muestra el número de línea elegido.
Esto me recuerda al experimento del perrito que tiene que abrir una reja con uno de dos botones. Un botón abre la rejay el otro le da un toque eléctrico. Así has-ta-que-se-e-du-que, ¡no faltaba más!



Cita:
Empezado por dec
En fin. Yo creo que aquí el tema no era este en absoluto, pues al cabo todo queda reducido a cómo me parece a mí esto y cómo me parece a mí lo otro.
Por el contrario, yo creo que este es precisamente el tema. Abriste el hilo comentando que el mencionado artículo te había hecho por fin entender cómo se usan las excepciones y has visto qe el tema no es tan inmediato y se presta a muchos estilos y circunstancias.

El mismo artículo, a mi no me queda claro.

Cita:
Empezado por dec
Yo lo único que he dicho es que he cometido el error que menciona Ian Marteens en no pocas ocasiones, y, efectivamente, reconozco que en muchas ocasiones que utilizé la instrucción try/except no contaba con ningún plan B y a veces terminaba levantando la excepción mediante un Raise ¡dentro de try/except!
Pero, ¿cuál es el error a que se refiere Marteens? Porque a juzgar por su descripción de la cláusula fault en Freya da la impresión de que justamente recomienda propagar la excepción. Para mi, hay excepciones que deen propagarse y otras no, depende de las circunstancias y objetivos.

// Saludos
Responder Con Cita
  #6  
Antiguo 15-07-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Los problemas que me has mostrado roman, aun con ser posibles y todo eso, no tienen nada que ver con lo que yo hago "para dirigir al usuario a una línea". De todos modos te agradezco los comentarios igual.

Por eso he recalcado arriba que estaba refiriéndome a un caso en concreto sobre el que había tomado una decisión, un caso concreto, que, claro está, no tiene porqué parecerse a otros casos concretos, por eso son concretos.

Cita:
Empezado por roman
Pero de cualquier forma, una construcción como
Código Delphi [-]
  try
    ...
  except
  end;
jamás debe hacerse. Me parece que ya lo dijo mamcx; al hacer esto escondes todas las excepciones posibles, no sólo las que uno prevee o piensa que pueden suceder.
Bueno, en este caso, me parece a mí que pocas excepciones podrían darse salvando el "EConvertError" presumible y ocultado al usuario porque personalmente lo creí mejor.

De todas maneras ya dije más arriba que había pasado a utilizar la función "TryStrToInt" y ese patrón de uso de try/except no es algo habitual en lo poco que escribo.

Cita:
Empezado por roman
Esto me recuerda al experimento del perrito que tiene que abrir una reja con uno de dos botones. Un botón abre la rejay el otro le da un toque eléctrico. Así has-ta-que-se-e-du-que, ¡no faltaba más!
¡Hombre, menuda comparación! Personalmente calculaba que el usuario se diera cuenta del "error" a la primera, de verdad lo digo: no estoy de acuerdo en absoluto de tratar al usuario como a tonto, porque yo soy usuario y a mí no me gusta que me traten como a tonto.

Así que no entiendo eso de "El usuario no es tonto, pero el programa debe estar diseñado para tontos." ¿En qué quedamos? ¿El usuario es tonto o no lo es? Porque si no lo es no podemos diseñar un progama para tonto: ¿en qué quedamos?

Cita:
Empezado por roman
El mismo artículo, a mi no me queda claro.
Pero es que me parece normal roman. Poniéndome un tanto en tu lugar prácticamente estoy por aseverar que haría lo mismo que tú en este caso. Creo que lo mismo no lo leen igual dos personas. Una saca unas conclusiones, otra otras.

Cita:
Empezado por roman
Pero, ¿cuál es el error a que se refiere Marteens?
¡Pues si es en lo que estamos de acuerdo! En que no deben emplearse patrones como la excepción try/except "vacía", para tapar errores, sin ir más lejos.

Y que tampoco se debe levantar una excepción dentro de una instrucción try/except, pues que sería levantar la misma excepción dos veces: para eso está raise.

Que si no se tiene un plan B, es decir, si no se sabe o no se puede o no se quiere tratar una excepción la instrucción try/except sobra, porque, precisamente, sirve justamente para cuando hay un plan B.

Con plan B se refiere Marteens a otra forma de hacer las cosas en caso de que de la primera forma que se pensó no salgan bien: puede que sea de perogrullo pero es que creo que no dirá el referido autor en vano que solamente para un 10% de las excepciones tenemos un plan B.

Cita:
Empezado por roman
Porque a juzgar por su descripción de la cláusula fault en Freya da la impresión de que justamente recomienda propagar la excepción
¡Claro! Precisamente porque la gente lo hace mal. Precisamente porque Ian Marteens presupone que lo van a seguir haciendo mal quiere él poner un granito de arena para que aún así las cosas puedan salir mejor. Pero te remito al comienzo del artículo, porque el autor lo explica mejor que yo.

Cita:
Empezado por roman
Para mi, hay excepciones que deen propagarse y otras no, depende de las circunstancias y objetivos.
Pues como en esto, salvando las distancias que puede haber entre tú y yo mirando lo que tú sabes y lo que yo no sé, también estamos de acuerdo, digo, que, al cabo al cabo la suma de acuerdos es mayor que la de desacuerdos.

Actualización:

Cita:
Empezado por Yo mismo
Personalmente calculaba que el usuario se diera cuenta del "error" a la primera (...)
¡Y que además no pensaba soltarle ninguna descarga! Es por esto que actualizo mi mensaje, para preguntar, ¿sabe alguien si, de la misma manera que puede hacerse sonar un ¡Beeep! es posible soltar una descarga al usuario de una aplicación hecha con Delphi? Es broma, a mí no se me ocurre pensar algo así.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 15-07-2005 a las 22:08:45. Razón: (actualización)
Responder Con Cita
  #7  
Antiguo 15-07-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 24
ContraVeneno Va por buen camino
Cita:
Originalmente publicado por dec
Así que no entiendo eso de "El usuario no es tonto, pero el programa debe estar diseñado para tontos." ¿En qué quedamos? ¿El usuario es tonto o no lo es? Porque si no lo es no podemos diseñar un progama para tonto: ¿en qué quedamos?
El siguiente ejemplo ilustra de manera MUY CLARA la justificación para la frase: "El usuario no es tonto, pero el programa debe estar diseñado para tontos" y cito:
Cita:
Originalmente publicado por Roman
¿Te imaginas qué pasaría si en un código de apenas unas cuantas líneas, el compilador no tuviera a bien decirnos: "Missing operator or semicolon" ¿Es obvio que los parámetros de una función deben ir separados por comas!
Estoy totalmente seguro que un compilador no es apto para tontos, sin embargo, debe estar preparado por si ocurre una tontería.
__________________


Última edición por ContraVeneno fecha: 15-07-2005 a las 22:49:11.
Responder Con Cita
  #8  
Antiguo 16-07-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Aunque entendiendo por dónde quieres ir, si no estoy equivocado, no puedo estar de acuerdo contigo en que el cierre de una instrucción, esto es, el punto y coma sea una tontería.

Prueba de ello es el aviso del compilador, más allá, prueba de ello es que el compilador no continuará adelante hasta que no se solucione "esa tontería".

¿Alguien puede explicarme qué es un programa diseñado para tontos? ¡No conozco ninguno! Si no es un programa "malicioso", que busca la ingenuidad del usuario o su carencia de conocimientos, para vete a saber qué.

Cualquier programa está pensado para alguien y aun alguienes. Y se presupone a ese alguien la capacidad de entender lo que quiere hacer. Porque un programa puede ser al mismo tiempo una herramienta: el usuario habrá de saber qué quiere hacer con ella.

Si PhotoShop, por poner un caso, fuera un programa hecho para tontos hasta yo podría hacer lindas imágenes, pero esto no es así: prueba de que PhotoShop no es un programa para tontos.

Vale. Podría hacer cualquier cosa que pareciera una imagen, pero todos sabemos lo que da de sí un programa como PhotoShop y ni por pienso sabría yo hacer algo como lo que por ejemplo estoy recordando ahora.

Delphi no es un programa para tontos. ¿O sí? Yo diría que no. Pero es un programa. Yo tengo entre manos un programa ahora y no lo estoy haciendo para tontos, puedo prometerlo. Porque no sabría cómo hacerlo, aunque quisiera.

Los asistentes para Windows (cualquiera de ellos) no están hechos para tontos. Simplifican, esconden, "hacen cosas". Si el usuario no quiere ir más allá yo no creo que sea tonto, es que simplemente no necesita más. ¿Para qué darle lo que no necesita? No es tonto: sabe lo que quiere.

Es verdad que no siempre. lamentablemente.

En todo caso creo que esto sería para debatirse, en el sentido de que seguramente aún no tenemos claro lo que el uno piensa que piensa el otro (por lo menos yo me incluyo en esa cuenta) y así será cuestión de dejar claro que, pase lo que pase, esto no pasaría nunca a mayores.

¡Pero yo no hago programas para tontos, que conste!
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 18-07-2005
Avatar de marceloalegre
[marceloalegre] marceloalegre is offline
Miembro Premium
 
Registrado: abr 2005
Ubicación: Mar del Plata - Argentina
Posts: 448
Poder: 20
marceloalegre Va por buen camino
Thumbs up try except

Lo que dice roman es correcto, sin seguir hablando de lo mismo, eso tiene que ser asi: LOS PROGRAMAS TIENEN QUE SER HECHOS PARA TONTOS...
es increible, las malas intepretaciones que puede tener la gente de las cosas!
yo basicamente utilizo mucho los try/except y siempre tenes q usar plan b,, muchas veces un aviso,, SIEMPRE, siempre los uso..

Saludos!
Responder Con Cita
  #10  
Antiguo 05-03-2008
sevilla19742 sevilla19742 is offline
Registrado
 
Registrado: mar 2008
Posts: 3
Poder: 0
sevilla19742 Va por buen camino
sevilla19742

¿Te imaginas qué pasaría si en un código de apenas unas cuantas líneas, el compilador no tuviera a bien decirnos: "Missing operator or semicolon" ¿Es obvio que los parámetros de una función deben ir separados por comas!
sevilla19742
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 10:14:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi