Come gestire correttamente le eccezioni nei blocchi try-except di Python?

wind17 IN 📗 Studente 👁 33 ⚑ Segnala Programmazione

Scrivo Python da un paio d'anni ormai e ancora non sono sicuro se dovrei catturare eccezioni specifiche o usare semplicemente una clausola except generica. Il mio codice attuale ha un sacco di gestori di eccezioni generici e mi chiedo se sia effettivamente una cattiva pratica o se vada bene per progetti più piccoli.

2 risposte

★ Miglior risposta

Cosa fa effettivamente il tuo codice quando arrivano quelle eccezioni - le registri, riprovi, o semplicemente continui in silenzio?

Il motivo per cui la gente insiste su eccezioni specifiche è che un `except:` nudo o `except Exception:` catturerà letteralmente tutto, incluse cose che non prevedevi e probabilmente non dovresti ignorare. Se stai cercando di aprire un file e catturi `FileNotFoundError`, è specifico e ha senso. Ma un except nudo catturerà anche cose come `KeyboardInterrupt` o `SystemExit`, che di solito vuoi lasciar passare. Ancora peggio, nasconde i bug - se il tuo codice ha un errore di battitura o un errore logico che solleva qualcosa di inaspettato, non lo vedrai mai perché la clausola except l'ha ingoiato.

Detto questo, per script più piccoli o roba veloce, la gente diventa pragmatica. La differenza si vede davvero quando stai debuggando o quando il tuo codice viene passato a qualcun altro. Le eccezioni specifiche rendono chiara la tua intenzione - questo codice sa come gestire un file mancante, ma non un problema di connessione al database. Se stai scrivendo qualcosa che rimarrà piccolo, catturare `Exception` (non bare `except`) è molto più sicuro di un gestore generale, e almeno puoi vedere cosa viene catturato. Man mano che i tuoi progetti crescono, vorrai diventare più specifico. La pratica di essere deliberato su cosa cattturi non è solo pedanteria - ti salva da bug misteriosi più tardi.

wind17 asker Al momento li sto solo registrando e andando avanti. Principalmente operazioni file I/O e chiamate API in piccoli script, quindi non ho ancora avuto problemi, ma vedo il tuo punto riguardo ai bug nascosti.

Le eccezioni specifiche battono quelle generiche perché catturerai bug che non intendevi nascondere - tipo un refuso nel nome di una variabile che genera `NameError`, che un `except:` nudo nasconderà invece di lasciarti sistemare. Anche per progetti più piccoli, l'abitudine ripaga in fretta; puoi sempre raggruppare eccezioni correlate come `except (ValueError, TypeError):` se vuoi mantenerlo snello.

La vera trappola che la gente salta: `except:` nudo cattura anche cose come `KeyboardInterrupt` e `SystemExit`, quindi il tuo programma potrebbe ignorare Ctrl+C dell'utente e continuare a girare. Usa `except Exception:` al minimo assoluto se hai bisogno di un catch-all, ma onestamente, spendi 30 secondi a capire cosa potrebbe realmente fallire ed elenca quelli.

La tua risposta

Accediper rispondere.