Les exceptions ne contiennent pas de détails utiles car le concept des exceptions n'a pas encore suffisamment mûri dans la discipline du génie logiciel, de sorte que de nombreux programmeurs ne les comprennent pas complètement et ne les traitent donc pas correctement.
Oui, IndexOutOfRangeException
devrait contenir l'index précis qui était hors de portée, ainsi que la plage qui était valide au moment où il a été lancé, et il est méprisable pour le compte des créateurs du runtime .NET qu'il n'en a pas. Oui, l’ table or view not found
exception d’Oracle doit contenir le nom de la table ou de la vue qui n’a pas été trouvée et, encore une fois, le fait qu’elle ne soit pas méprisable au nom de celui qui en est responsable.
La confusion provient en grande partie de l'idée originale erronée selon laquelle les exceptions devraient contenir des messages lisibles par l'homme, ce qui découle d'un manque de compréhension de ce que sont les exceptions, il s'agit donc d'un cercle vicieux.
Puisque les gens pensent que l’exception devrait contenir un message lisible par l’homme, ils sont convaincus que toute information transportée par l’exception devrait également être formatée en un message lisible par l’homme, puis ils sont ennuyés d’écrire tout le message lisible par l’homme. code du bâtiment, ou craignent que cela ne divulgue une quantité déconseillée d'informations à tous les regards indiscrets qui pourraient voir le message. (Les problèmes de sécurité mentionnés par d'autres réponses.)
Mais la vérité est qu’ils ne devraient pas s’inquiéter de cela, car l’exception ne devrait pas contenir un message lisible par l’homme. Les exceptions sont des choses que seuls les programmeurs devraient voir et / ou traiter. S'il est toujours nécessaire de présenter des informations sur les défaillances à un utilisateur, vous devez le faire à un niveau très élevé, de manière sophistiquée et dans la langue de l'utilisateur, qui, statistiquement, a peu de chances d'être l'anglais.
Ainsi, pour nous programmeurs, le "message" de l'exception est le nom de la classe de l'exception , et toute autre information pertinente à l'exception doit être copiée dans les variables membres (final / en lecture seule) de l'objet exception. De préférence, chaque petit morceau imaginable. De cette façon, aucun message n’a besoin (ou ne devrait) être généré, et donc aucun regard ne peut le voir.
Pour répondre à la préoccupation exprimée par Thomas Owens dans un commentaire ci-dessous:
Oui, bien sûr, à un certain niveau, vous allez créer un message de journal au sujet de l'exception. Mais vous voyez déjà le problème avec ce que vous dites: d'un côté, un message de journal d'exception sans trace de pile est inutile, mais d'un autre côté, vous ne voulez pas que l'utilisateur voie l'intégralité du tracé de la pile des exceptions. Encore une fois, notre problème ici est que notre perspective est faussée par les pratiques traditionnelles. Les fichiers journaux sont traditionnellement en texte brut, ce qui était peut-être correct alors que notre discipline en était à ses balbutiements, mais peut-être plus maintenant: s'il existe un problème de sécurité, le fichier journal doit être binaire et / ou crypté.
Que ce soit en binaire ou en texte brut, le fichier journal doit être considéré comme un flux dans lequel l'application sérialise les informations de débogage. Un tel flux serait réservé aux yeux des programmeurs, et la tâche de générer des informations de débogage pour une exception devrait être aussi simple que la sérialisation de l'exception dans le flux de journal de débogage. De cette façon, en consultant le journal, vous voyez le nom de la classe d’exception (qui, comme je l’ai déjà dit, est à toutes fins pratiques "le message",) chacune des variables de membre d’exception qui décrivent tout ce qui est pertinent. et-pratique-à-inclure-dans-un-journal, et la trace entière de la pile. Notez que la mise en forme d'un message d'exception lisible par l'homme est visiblement absente de ce processus.
PS
Cette réponse contient quelques autres réflexions sur ce sujet: comment rédiger un bon message d’exception
PPS
Il semble que beaucoup de gens étaient cochés par ma suggestion sur les fichiers journaux binaires, donc je modifie la réponse une fois de plus pour le rendre encore plus clair que ce que je veux dire ici est pas que le fichier journal doit être binaire, mais le fichier journal peut être binaire, si besoin est.