NUNCA lo olvides, mensajes de usuario en lugar de mensajes de excepción

Hace poco menos de 1 mes me encontraba en una de esas famosas tiendas de Madrid y de otras partes de España donde se puede hacer casi de todo (hacer la compra mínima de urgencia, comer o cenar, comprar o leer libros y revistas, comprar música y películas...).
Próximo a la parte de la tienda dedicada a la música y las películas me encontré una curiosa caja de metal y de forma rectangular para recoger entradas para ir al cine y espectáculos.
Me quedé mirando el "cacharro", que no era otra cosa que una caja metálica con una pantalla y un pequeño interfaz para registrar los datos personales que nos solicitaba, y un flamante cable que salía descaradamente de la parte posterior para esconderse en el suelo en una más que posible regleta.
Como uno es curioso por naturaleza y puesto que nadie me lo impedía, me puse a toquetear en la aplicación para ver que tal se comportaba, como era de amigable, y bueno... pensando en que siempre es posible aprender algo nuevo (porqué no decirlo).
Empecé a usar la aplicación, y sin entrar en la discusión de si era más o menos bonita, intuituva, etc., y centránome en lo estrictamente funcional, efectivamente obtuve un listado de los espectáculos en cartelera, una breve sipnosis, y simulé que quería una entrada de una de los espectáculos para ver hasta donde podía llegar y "probar" más aún todo el proceso.
Todo fue correctamente hasta que llegó el momento de conectarme con el servidor para reservar asiento y formalizar la compra.
Ahí y transcurrido un rato, ocurrió un error con el sistema y me devolvió un pantallazo como el que se puede ver a continuación (no os fijéis mucho en la pobre calidad de la imagen):

El pantallazo es realmente nefasto. El error está claro que parece estar originado por un timeout en la respuesta del servidor de base de datos.
Ahora bien, todo esto para indicar una cosa que se repite una y otra vez, que no es nueva, pero que no siempre tenemos presente en los desarrollos Software que hacemos.
Repita conmigo: ¡NO es conveniente ni buena práctica volcar en pantalla la información que devuelve una excepción!.
Seamos un poco más estrictos y repita nuevamente conmigo: ¡NUNCA muestre mensajes de excepciones ni mensajes genéricos a un usuario!.
Se me revuelven las tripas de solo ver la imagen que capturé con el mensaje que apareció en pantalla. En mi caso porque entiendo un poquito lo que puede haber pasado, pero un usuario normal... ¿qué le importa todo eso que aparece en pantalla o para qué es?.
Al usuario lo que le interesaba es que apareciese no todo ese texto ahí desorganizado, sino un simple mensaje del tipo: "En estos instantes, la aplicación no es capaz de conectarse con el sevidor. Inténtelo pasados unos minutos o más tarde.".
Eso sin entrar en el detalle de que en la pantalla aparecen los dos posibles casos con diferente fuente de letra y enmarañado entre el mensaje devuelto por la excepción.
Está claro, que en el log interno se podría haber registrado el detalle del error, pero al usuario le importa realmente un rábano si es un Timeout expired, si tiene algo que ver o no EntaNetDAL.EntaNetSQLDB.Generic o lo que sea.
¿Porqué pasa esto?. Porque muchas veces pensamos como programadores y no como usuarios. Tan simple como eso.
No obstante y tratando otro tema mucho más sensible sobre lo mismo, el riesgo de mostrar mensajes de este tipo, es grandísimo, ya que en algunas ocasiones, podríamos comprometer incluso la seguridad de la aplicación y/o de los datos si mostramos información relevante. No sería la primera vez que aparece información sensible y que de repente, "alguien" nos ha hackeado nuestra aplicación.
Recordemos siempre que los usuarios solo entienden un lenguaje. El lenguaje breve, claro y conciso.
Los programadores y técnicos hablamos en una jerga mucho más compleja y técnica, pero el usuario solo quiere algo agradable a la vista, incluso cuando se produce un error de tipo Timeout como el caso del ejemplo.
Finalmente, agrego como referencias alguna documentación útil sobre el tema de las excepciones, por si queremos aprender más acerca de ellas.
Referencias:
Una interesante entrada en inglés sobre las mejores prácticas en el manejo de excepciones.
Krzysztof Cwalina con cuenta en inglés como elegir el tipo de excepción correcta a lanzar.
El equipo de CLR de Microsoft nos cuenta en inglés porqué es malo capturar Exception o una excepción en blanco.
Información del blog de Shiman's sobre las excepciones de aplicación.
Exception Management Architecture Guide. Guía de Microsoft sobre la gestión de excepciones.