Le eccezioni non contengono dettagli utili perché il concetto di eccezioni non è ancora maturato abbastanza 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 che non rientrava nell'intervallo, nonché l'intervallo valido al momento del lancio ed è spregevole per conto dei creatori del runtime .NET che non lo è. Sì, l' table or view not found
eccezione di Oracle dovrebbe contenere il nome della tabella o della vista che non è stata trovata e, di nuovo, il fatto che non sia spregevole da parte di chiunque ne sia responsabile.
In gran parte, la confusione deriva dall'idea originale sbagliata secondo cui le eccezioni dovrebbero contenere messaggi leggibili dall'uomo, che a loro volta derivano dalla mancanza di comprensione di quali siano le eccezioni, quindi è un circolo vizioso.
Poiché le persone pensano che l'eccezione debba contenere un messaggio leggibile dall'uomo, credono che qualunque informazione sia trasportata dall'eccezione dovrebbe anche essere formattata nel messaggio leggibile dall'uomo, e quindi si annoiano a scrivere tutto il messaggio leggibile dall'uomo- codice di costruzione, o temono che ciò potrebbe rivelare una quantità sconsigliata di informazioni a qualunque occhio indiscreto possa vedere il messaggio. (I problemi di sicurezza menzionati da altre risposte.)
Ma la verità è che non dovrebbero preoccuparsene perché l'eccezione non dovrebbe contenere un messaggio leggibile dall'uomo. Le eccezioni sono cose che solo i programmatori dovrebbero mai vedere e / o affrontare. Se c'è mai la necessità di presentare informazioni di errore a un utente, ciò deve essere fatto a un livello molto alto, in modo sofisticato e nella lingua dell'utente, che, statisticamente parlando, è improbabile che sia l'inglese.
Quindi, per noi programmatori, il "messaggio" dell'eccezione è il nome della classe dell'eccezione e qualsiasi altra informazione pertinente all'eccezione deve essere copiata nelle variabili membro (finale / sola lettura) dell'oggetto eccezione. Preferibilmente, ogni singolo piccolo concepibile di esso. 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, si verrà creare un messaggio di registro per quanto riguarda l'eccezione. Ma vedi già il problema con quello che stai dicendo: da un lato, un messaggio di registro delle eccezioni senza una traccia dello stack è inutile, ma d'altra parte, non vuoi che l'utente veda l'intera traccia dello stack delle eccezioni. Ancora una volta, il nostro problema qui è che la nostra prospettiva è distorta dalle pratiche tradizionali. I file di registro sono stati tradizionalmente in testo semplice, il che potrebbe essere andato bene mentre la nostra disciplina era agli inizi, ma forse non più: se esiste un problema di sicurezza, il file di registro deve essere binario e / o crittografato.
Che si tratti di testo binario o semplice, il file di registro deve essere considerato come un flusso in cui l'applicazione serializza le informazioni di debug. Tale flusso sarebbe solo per gli occhi dei programmatori e il compito di generare informazioni di debug per un'eccezione dovrebbe essere semplice quanto serializzare l'eccezione nel flusso di log di debug. In questo modo, guardando il registro si arriva a vedere il nome della classe di eccezione (che, come ho già detto, è per tutti gli scopi pratici "il messaggio"), ciascuna delle variabili del membro di eccezione che descrivono tutto ciò che è pertinente- e-pratico-da-includere-in-un-registro e l'intera traccia dello stack. Si noti come la formattazione di un messaggio di eccezione leggibile dall'uomo manchi in modo evidente da questo processo.
PS
Alcuni altri miei pensieri su questo argomento possono essere trovati in questa risposta: Come scrivere un buon messaggio di eccezione
PPS
Sembra che molte persone siano state tratteggiate dal mio suggerimento sui file di registro binari, quindi ho modificato ancora una volta la risposta per rendere ancora più chiaro che ciò che sto suggerendo qui non è che il file di registro dovrebbe essere binario, ma che il file di registro può essere binario, se necessario.