Las excepciones no contienen detalles útiles porque el concepto de excepciones aún no ha madurado lo suficiente dentro de la disciplina de ingeniería de software, por lo que muchos programadores no las entienden completamente y, por lo tanto, no las tratan adecuadamente.
Sí, IndexOutOfRangeException
debe contener el índice preciso que estaba fuera del rango, así como el rango que era válido en el momento en que se lanzó, y es despreciable en nombre de los creadores del tiempo de ejecución de .NET que no lo hace. Sí, la table or view not found
excepción de Oracle debe contener el nombre de la tabla o vista que no se encontró, y nuevamente, el hecho de que no lo haga es despreciable en nombre de quien sea responsable de esto.
En gran parte, la confusión se deriva de la idea original equivocada de que las excepciones deben contener mensajes legibles por los humanos, lo que a su vez se debe a la falta de comprensión de qué se tratan las excepciones, por lo que es un círculo vicioso.
Dado que las personas piensan que la excepción debe contener un mensaje legible por humanos, creen que cualquier información que contenga la excepción también debe formatearse en el mensaje legible por humanos, y luego se aburren de escribir todo el mensaje legible por humanos. código de construcción, o tienen miedo de que hacerlo pueda estar divulgando una cantidad de información desaconsejable a los ojos curiosos que puedan ver el mensaje. (Los problemas de seguridad mencionados por otras respuestas).
Pero la verdad del asunto es que no deberían preocuparse por eso porque la excepción no debe contener un mensaje legible por humanos. Las excepciones son cosas que solo los programadores deberían ver y / o tratar. Si alguna vez es necesario presentar información de fallas a un usuario, debe hacerlo a un nivel muy alto, de manera sofisticada y en el idioma del usuario, que, estadísticamente hablando, es poco probable que sea inglés.
Entonces, para nosotros los programadores, el "mensaje" de la excepción es el nombre de la clase de la excepción , y cualquier otra información pertinente a la excepción debe copiarse en las variables miembro (final / solo lectura) del objeto de excepción. Preferiblemente, cada pequeño fragmento concebible. De esta manera, no es necesario (o debería) generar un mensaje, y por lo tanto, ningún ojo curioso puede verlo.
Para abordar la preocupación expresada por Thomas Owens en un comentario a continuación:
Sí, por supuesto, en algún nivel, se va a crear un mensaje de registro con respecto a la excepción. Pero ya ve el problema con lo que está diciendo: por un lado, un mensaje de registro de excepción sin un seguimiento de pila es inútil, pero por otro lado, no desea permitir que el usuario vea el seguimiento completo de la pila de excepción. Nuevamente, nuestro problema aquí es que nuestra perspectiva está sesgada por las prácticas tradicionales. Los archivos de registro han estado tradicionalmente en texto plano, lo que puede haber estado bien mientras nuestra disciplina estaba en su infancia, pero tal vez ya no: si existe un problema de seguridad, entonces el archivo de registro debe ser binario y / o encriptado.
Ya sea texto binario o simple, el archivo de registro debe considerarse como una secuencia en la que la aplicación serializa la información de depuración. Tal flujo sería solo para los ojos de los programadores, y la tarea de generar información de depuración para una excepción debería ser tan simple como serializar la excepción en el flujo de registro de depuración. De esta manera, al mirar el registro puede ver el nombre de la clase de excepción (que, como ya he dicho, es para todos los propósitos prácticos "el mensaje"), cada una de las variables miembro de excepción que describen todo lo pertinente. y-práctico-para-incluir-en-un-registro, y todo el seguimiento de la pila. Observe cómo el formato de un mensaje de excepción legible por humanos falta notablemente en este proceso.
PD
Algunos de mis pensamientos sobre este tema se pueden encontrar en esta respuesta: Cómo escribir un buen mensaje de excepción
PPS
Parece que una gran cantidad de personas estaban siendo enumeró por mi sugerencia acerca de los archivos de registro binario, por lo que modificó la respuesta una vez más para que sea aún más claro que lo que estoy sugiriendo aquí es no que el archivo de registro debe ser binarios, pero eso el archivo de registro puede ser binario, si es necesario.