Se la gestione degli errori lanciando eccezioni è buona o cattiva è controverso.
Sono eccezioni come flusso di controllo considerato un serio antipattern? In tal caso, perché?
La linea comune è che le eccezioni sono per "circostanze eccezionali". Ma cosa succede se un autore di una biblioteca ha deciso di lanciare un'eccezione? L'autore della biblioteca non può prevedere quale potrebbe essere una "circostanza eccezionale" per noi.
Ovviamente, se non possiamo escludere un'eccezione generata da una funzione che dobbiamo usare così com'è e che consente l'eccezione di ribollire fino alla cima è inaccettabile, allora dobbiamo catturare l'eccezione .
Spesso, tuttavia, possiamo adottare misure preventive. Con uno sforzo sufficiente potremmo persino essere in grado di garantire che le condizioni in cui la funzione della libreria genererebbe un'eccezione non si verificherà mai. Il lancio sarà ancora lì (non è una nostra scelta), ma possiamo eliminare la necessità di provare e catturare.
Un esempio è std::map.at()
. (Fai finta che non ci sia std::map.find()
.)
Qual è la saggezza generale? È di buon gusto scrivere codice con l'aspettativa che una funzione di libreria occasionalmente venga lanciata? Il codice cliente è obbligato a ridurre al minimo l'uso di eccezioni?
Modifica Per cercare di distinguerlo di più dalle domande passate e di essere più concreti, supponiamo di avere qualche funzione di libreria che potrebbe generare un errore non trovato nel file. Alcuni codici client vogliono utilizzare la libreria per accedere a un file. Il codice client viene programmato con l'aspettativa che il file a volte non esista, anche in "circostanze non eccezionali". Il codice client può essere in grado di verificare se la funzione della libreria genererà un'eccezione prima di essere chiamata, ma non è banale farlo. Il codice client deve ammucchiare ulteriori errori durante il controllo degli errori all'interno della libreria o il codice client deve utilizzare l'eccezione generata dalla libreria come flusso di controllo?
In tal caso aggiungere codice di gestione degli errori in cima alla libreria sarà quasi certamente meno efficace di un errore, richiederà meno codice e si potrebbe sostenere che deve provare / Prendi comunque. D'altra parte è un meccanismo di controllo del flusso decisamente non eccezionale.