As exceções não contêm detalhes úteis porque o conceito de exceções ainda não amadureceu na disciplina de engenharia de software; muitos programadores não as entendem completamente e, portanto, não as tratam adequadamente.
Sim, IndexOutOfRangeException
deve conter o índice preciso que estava fora do intervalo, bem como o intervalo válido no momento em que foi lançado, e é desprezível em nome dos criadores do tempo de execução do .NET que não. Sim, a table or view not found
exceção da Oracle deve conter o nome da tabela ou exibição que não foi encontrada e, novamente, o fato de não existir é desprezível em nome de quem é responsável por isso.
Em grande parte, a confusão decorre da idéia original equivocada de que as exceções devem conter mensagens legíveis por humanos, que, por sua vez, decorrem da falta de compreensão do que são essas exceções; portanto, é um ciclo vicioso.
Como as pessoas pensam que a exceção deve conter uma mensagem legível por humanos, elas acreditam que qualquer informação transmitida pela exceção também deve ser formatada na mensagem legível por humanos e, em seguida, ficam entediadas em escrever todas as mensagens legíveis por humanos - código de construção, ou eles temem que isso possa estar divulgando uma quantidade desaconselhável de informações para qualquer olhar curioso que possa ver a mensagem. (Os problemas de segurança mencionados por outras respostas.)
Mas a verdade é que eles não devem se preocupar com isso, porque a exceção não deve conter uma mensagem legível por humanos. Exceções são coisas que somente os programadores devem ver e / ou lidar. Se houver a necessidade de apresentar informações de falha a um usuário, isso deve ser feito em um nível muito alto, de maneira sofisticada e no idioma do usuário, que, estatisticamente falando, é improvável que seja inglês.
Portanto, para nós programadores, a "mensagem" da exceção é o nome da classe da exceção , e qualquer outra informação pertinente à exceção deve ser copiada nas variáveis de membro (final / somente leitura) do objeto de exceção. De preferência, cada pedacinho concebível disso. Dessa forma, nenhuma mensagem precisa (ou deve) ser gerada e, portanto, nenhum olhar curioso pode vê-la.
Para abordar a preocupação expressa por Thomas Owens em um comentário abaixo:
Sim, claro que, em algum nível, você vai criar uma mensagem de log sobre a exceção. Mas você já vê o problema do que está dizendo: por um lado, uma mensagem de log de exceção sem rastreamento de pilha é inútil, mas, por outro lado, não deseja permitir que o usuário veja todo o rastreamento de pilha de exceção. Novamente, nosso problema aqui é que nossa perspectiva é distorcida pelas práticas tradicionais. Os arquivos de log tradicionalmente estão em texto simples, o que pode ter sido bom enquanto nossa disciplina ainda estava em sua infância, mas talvez não mais: se houver um problema de segurança, o arquivo de log deverá ser binário e / ou criptografado.
Seja binário ou texto sem formatação, o arquivo de log deve ser considerado como um fluxo no qual o aplicativo serializa as informações de depuração. Esse fluxo seria apenas para os olhos dos programadores, e a tarefa de gerar informações de depuração para uma exceção deve ser tão simples quanto serializar a exceção no fluxo de log de depuração. Dessa forma, observando o log, você verá o nome da classe de exceção (que, como já afirmei, é para todos os fins práticos "a mensagem"), cada uma das variáveis de membro de exceção que descrevem tudo o que é pertinente. e prático de incluir em um log e todo o rastreamento de pilha. Observe como a formatação de uma mensagem de exceção legível por humanos está conspicuamente ausente desse processo.
PS
Mais alguns dos meus pensamentos sobre esse assunto podem ser encontrados nesta resposta: Como escrever uma boa mensagem de exceção
PPS
Parece que um monte de pessoas estavam sendo incomodada por minha sugestão sobre arquivos de log binário, então eu alterada a resposta, mais uma vez para torná-lo ainda mais claro que o que eu estou sugerindo aqui é não que o arquivo de log deve ser binário, mas que o arquivo de log pode ser binário, se necessário.