A mio avviso, le eccezioni sono uno strumento essenziale per rilevare errori di codice in fase di esecuzione. Sia nelle prove che nella produzione. Rendi i loro messaggi abbastanza dettagliati, così in combinazione con una traccia dello stack puoi capire cosa è successo da un registro.
Le eccezioni sono principalmente uno strumento di sviluppo e un modo per ottenere ragionevoli segnalazioni di errori dalla produzione in casi imprevisti.
A parte la separazione delle preoccupazioni (percorso felice con solo errori previsti rispetto al fallire fino a raggiungere un gestore generico per errori imprevisti) essere una buona cosa, rendendo il tuo codice più leggibile e mantenibile, è infatti impossibile preparare il tuo codice per tutto il possibile casi imprevisti, anche gonfiandolo con codice di gestione degli errori per completare illeggibilità.
Questo è in realtà il significato di "imprevisto".
A proposito, cosa ci si aspetta e cosa no è una decisione che può essere presa solo sul sito di chiamata. Ecco perché le eccezioni verificate in Java non hanno funzionato: la decisione viene presa al momento dello sviluppo di un'API, quando non è affatto chiaro cosa ci si aspetti o imprevisto.
Esempio semplice: l'API di una mappa hash può avere due metodi:
Value get(Key)
e
Option<Value> getOption(key)
il primo genera un'eccezione se non trovato, il secondo ti dà un valore opzionale. In alcuni casi, quest'ultimo ha più senso, ma in altri, il tuo codice deve aspettarsi che ci sia un valore per una determinata chiave, quindi se non ce n'è uno, è un errore che questo codice non può risolvere perché un l'ipotesi è fallita. In questo caso, in realtà è il comportamento desiderato che esca dal percorso del codice e scenda a qualche gestore generico nel caso in cui la chiamata fallisca.
Il codice non dovrebbe mai tentare di gestire ipotesi di base fallite.
Tranne controllandoli e lanciando eccezioni ben leggibili, ovviamente.
Lanciare eccezioni non è male ma catturarle potrebbe esserlo. Non tentare di correggere errori imprevisti. Cattura le eccezioni in alcuni punti in cui desideri continuare qualche ciclo o operazione, registrale, magari segnala un errore sconosciuto e il gioco è fatto.
I blocchi di cattura in tutto il luogo sono una pessima idea.
Progetta le tue API in modo da esprimere facilmente le tue intenzioni, ovvero dichiarare se ti aspetti un determinato caso, come chiave non trovata o meno. Gli utenti della tua API possono quindi scegliere la chiamata di lancio solo per casi davvero imprevisti.
Immagino che la ragione per cui le persone risentono delle eccezioni e vanno troppo lontano omettendo questo strumento cruciale per l'automazione della gestione degli errori e una migliore separazione delle preoccupazioni dalle nuove lingue sono brutte esperienze.
Questo e alcuni equivoci su ciò a cui sono effettivamente utili.
Simulandoli facendo TUTTO attraverso l'associazione monadica, il codice diventa meno leggibile e mantenibile e si finisce senza una traccia dello stack, il che peggiora questo approccio.
La gestione degli errori di stile funzionale è ottima per i casi di errore previsti.
Lascia che la gestione delle eccezioni si occupi automaticamente di tutto il resto, ecco a cosa serve :)
panic
che non è esattamente lo stesso. Inoltre, ciò che viene detto lì, un'eccezione non è molto più di un modo sofisticato (ma comodo) per eseguire unGOTO
, sebbene nessuno lo chiami in quel modo, per ovvie ragioni.