Exceções não contêm detalhes úteis porque o conceito de exceções ainda não amadureceu o suficiente dentro da disciplina de engenharia de software, então muitos programadores não as compreendem 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 isso não acontece. Sim, a exceção table or view not found
da Oracle deve conter o nome da tabela ou exibição que não foi encontrada e, novamente, o fato de não ser desprezível em nome de quem é responsável por isso.
Em grande parte, a confusão decorre da ideia original equivocada de que as exceções devem conter mensagens legíveis, o que, por sua vez, resulta de uma falta de compreensão do que são as exceções, portanto, é um ciclo vicioso.
Como as pessoas acham que a exceção deve conter uma mensagem legível, elas acreditam que qualquer informação transportada pela exceção também deve ser formatada na mensagem legível por humanos, e então elas estão entediadas para escrever todas as informações. código de construção de mensagens legível, ou eles têm medo de 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. Exceções são coisas que apenas 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, o que, estatisticamente falando, é pouco provável que seja inglês.
Então, 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 em (final / readonly) variáveis de membro do objeto de exceção. De preferência, cada pequena parte concebível. Desta forma, nenhuma mensagem precisa (ou deve) ser gerada e, portanto, nenhum olhar pode vê-la.
Para resolver a preocupação expressa por Thomas Owens em um comentário abaixo:
Sim, claro, em algum nível, você irá criar uma mensagem de log referente à exceção. Mas você já vê o problema com o que está dizendo: por um lado, uma mensagem de log de exceção sem um rastreio de pilha é inútil, mas, por outro lado, você não quer 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 têm sido tradicionalmente escritos em texto simples, o que pode ter sido bom enquanto nossa disciplina estava em sua infância, mas talvez não mais: se houver uma preocupação de segurança, o arquivo de log deve ser binário e / ou criptografado.
Seja texto binário ou simples, o arquivo de log deve ser considerado como um fluxo no qual o aplicativo serializa 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. Desta forma, observando o log, você verá o nome da classe de exceção (que, como já afirmei, é para todos os propósitos práticos "a mensagem"), cada uma das variáveis de membro de exceção que descrevem tudo o que é pertinente. e-prático-para-incluir-em-um-log e todo o rastreamento de pilha. Note como a formatação de uma mensagem de exceção legível é claramente ausente deste processo.
P.S.
Mais algumas reflexões sobre esse assunto podem ser encontradas nesta resposta: Como escrever uma boa mensagem de exceção
P.P.S.
Parece que muitas pessoas ficaram incomodadas com a minha sugestão sobre arquivos de log binários, então alterei a resposta mais uma vez para deixar ainda mais claro que o que 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.