Le eccezioni non contengono dettagli utili perché il concetto di eccezioni non è ancora maturato nella disciplina dell'ingegneria del software, quindi molti programmatori non le comprendono completamente e quindi non le trattano correttamente.
Sì, IndexOutOfRangeException
dovrebbe contenere l'indice preciso fuori intervallo, nonché l'intervallo che era valido al momento in cui è stato generato, ed è spregevole per conto dei creatori del runtime .NET che non è così. Sì, l'eccezione table or view not found
di Oracle dovrebbe contenere il nome della tabella o della vista che non è stata trovata e, ancora una volta, il fatto che non sia spregevole per conto di chiunque sia responsabile di ciò.
In gran parte, la confusione deriva dall'idea errata originaria secondo cui le eccezioni dovrebbero contenere messaggi leggibili dall'uomo, il che a sua volta deriva dalla mancanza di comprensione di quali eccezioni riguardano, quindi è un circolo vizioso.
Poiché le persone pensano che l'eccezione debba contenere un messaggio leggibile dall'uomo, credono che qualsiasi informazione trasportata dall'eccezione debba anche essere formattata nel messaggio leggibile dall'uomo, e quindi sono annoiati a scrivere tutte le informazioni umane- codice di costruzione dei messaggi leggibile, o hanno paura che farlo potrebbe rivelare una quantità sconsigliabile di informazioni a qualunque sguardo indiscreto possa vedere il messaggio. (I problemi di sicurezza citati da altre risposte.)
Ma la verità è che non dovrebbero preoccuparsene perché l'eccezione dovrebbe non contenere un messaggio leggibile. Le eccezioni sono cose che solo i programmatori dovrebbero mai vedere e / o gestire. Se c'è mai la necessità di presentare le informazioni di errore a un utente, questo deve essere fatto ad un livello molto alto, in un modo sofisticato, e nella lingua dell'utente, che, statisticamente parlando, è improbabile che sia inglese.
Quindi, per noi programmatori, il "messaggio" dell'eccezione è il nome classe dell'eccezione e qualsiasi altra informazione pertinente all'eccezione dovrebbe essere copiata in variabili membro (finale / sola lettura) dell'oggetto eccezione. Preferibilmente, ogni singolo piccolo pezzo immaginabile. In questo modo, nessun messaggio deve (o dovrebbe) essere generato, e quindi nessun occhio indiscreto può vederlo.
Per rispondere alla preoccupazione espressa da Thomas Owens in un commento qui sotto:
Sì, certo, a un certo livello, creerà un messaggio di registro relativo all'eccezione. Ma vedi già il problema con quello che stai dicendo: da una parte, un messaggio di log di eccezioni senza una traccia di stack è inutile, ma d'altra parte, non vuoi permettere all'utente di vedere l'intera traccia dello stack di eccezioni. Di nuovo, il nostro problema qui è che la nostra prospettiva è distorta dalle pratiche tradizionali. I file di registro sono stati tradizionalmente in testo normale, il che poteva andar bene mentre la nostra disciplina era ancora agli inizi, ma forse non più: se esiste un problema di sicurezza, il file di registro deve essere binario e / o crittografato.
Indipendentemente dal testo binario o semplice, il file di log dovrebbe essere considerato come uno stream in cui l'applicazione serializza le informazioni di debug. Tale flusso sarebbe riservato agli occhi dei programmatori e il compito di generare informazioni di debug per un'eccezione dovrebbe essere semplice come serializzare l'eccezione nel flusso del log di debug. In questo modo, osservando il log si vede il nome della classe di eccezione (che, come ho già detto, è per tutti gli scopi pratici "il messaggio",) ciascuna delle variabili membro di eccezione che descrivono tutto ciò che è pertinente- e-pratico-da-includere-in-un-log e l'intera traccia dello stack. Nota come la formattazione di un messaggio di eccezione leggibile dall'uomo è vistosamente mancante da questo processo.
P.S.
Alcuni altri miei pensieri su questo argomento possono essere trovati in questa risposta: Come scrivere un messaggio di eccezione
P.P.S.
Sembra che molte persone siano state escluse dal mio suggerimento sui file di log binari, quindi ho modificato la risposta ancora una volta per rendere ancora più chiaro che ciò che sto suggerendo qui è not che il file di log dovrebbe essere binario, ma che il file di log potrebbe essere binario, se necessario.