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 correctamente.
Sí, IndexOutOfRangeException
debe contener el índice exacto 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 .NET que no lo hace Sí, la excepción table or view not found
de Oracle debe contener el nombre de la tabla o vista que no se encontró, y nuevamente, el hecho de que no sea 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 humanos, lo que a su vez se debe a una falta de comprensión de lo que se trata las excepciones, por lo que es un círculo vicioso.
Dado que la gente piensa que la excepción debe contener un mensaje legible para el ser humano, cree que cualquier información que se aporte en la excepción también debe tener el formato del mensaje legible para el hombre, y entonces están aburridos de escribir todo el texto del mensaje. código de creación de mensajes legibles, o temen que al hacerlo se esté divulgando una cantidad de información no aconsejable a cualquier persona que vea el mensaje. (Los problemas de seguridad mencionados en otras respuestas).
Pero la verdad del asunto es que no deberían preocuparse por eso porque la excepción no debería no contener un mensaje legible para los 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, eso debe hacerse 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 clase de la excepción , y cualquier otra información pertinente a la excepción debe copiarse en las variables miembro (final / readonly) del objeto de excepción. Preferiblemente, cada pequeña parte concebible de ella. De esta manera, ningún mensaje debe (o debería) generarse, y por lo tanto, ningún ojo indiscreto puede verlo.
Para abordar la preocupación expresada por Thomas Owens en un comentario a continuación:
Sí, por supuesto, en algún nivel, creará un mensaje de registro relacionado con 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 quiere permitir que el usuario vea todo el seguimiento de pila de excepción. Nuevamente, nuestro problema aquí es que nuestra perspectiva está sesgada por las prácticas tradicionales. Los archivos de registro tradicionalmente han estado en texto sin formato, lo que puede haber estado bien mientras nuestra disciplina estaba en su infancia, pero quizás ya no: si existe un problema de seguridad, entonces el archivo de registro debe ser binario y / o encriptado.
Ya sea en formato binario o en texto plano, el archivo de registro debe considerarse como una secuencia en la que la aplicación serializa la información de depuración. Dicha secuencia 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 la secuencia 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 indicado, es para todos los propósitos prácticos "el mensaje",) cada una de las variables de miembro de excepción que describen todo lo que es pertinente. e-práctico-para-incluir-en-un-registro, y todo el seguimiento de la pila. Tenga en cuenta que el formato de un mensaje de excepción legible para el ser humano falta notoriamente falta en este proceso.
P.S.
Algunos de mis pensamientos más sobre este tema se pueden encontrar en esta respuesta: Cómo escribir un buen mensaje de excepción
P.P.S.
Parece que a mucha gente le molestó mi sugerencia acerca de los archivos de registro binarios, así que enmendé la respuesta una vez más para dejar más claro que lo que estoy sugiriendo aquí es no que el archivo de registro debería ser binario, pero que el archivo de registro puede ser binario, si es necesario.