L'argomento principale del libro è che la versione dell'eccezione del codice è migliore perché catturerà tutto ciò che potresti aver trascurato se avessi provato a scrivere il tuo controllo degli errori.
Penso che questa affermazione sia vera solo in circostanze molto specifiche, in cui non ti interessa se l'output è corretto.
Non c'è dubbio che l'eccezione innalzamento è una pratica sana e sicura. Dovresti farlo ogni volta che ritieni che ci sia qualcosa nello stato attuale del programma che tu (come sviluppatore) non puoi, o non vuoi, affrontare.
Il tuo esempio, tuttavia, riguarda le eccezioni catching . Se rilevi un'eccezione, sei non che ti protegge dagli scenari che potresti aver trascurato. Stai facendo esattamente il contrario: presumi di non aver trascurato nessuno scenario che potrebbe aver causato questo tipo di eccezione, e quindi sei sicuro che sia giusto prenderlo (e quindi impedire che causi l'uscita del programma, come qualsiasi eccezione non rilevata).
Utilizzando l'approccio dell'eccezione, se vedi l'eccezione ValueError
, salti una linea. Utilizzando l'approccio tradizionale non-eccezione, si conta il numero di valori restituiti da split
, e se è inferiore a 2, si salta una linea. Dovresti sentirti più sicuro con l'approccio delle eccezioni, dal momento che potresti aver dimenticato alcune altre situazioni di "errore" nel tradizionale controllo degli errori, e except ValueError
li prenderebbe per te?
Dipende dalla natura del tuo programma.
Se stai scrivendo, ad esempio, un browser Web o un lettore video, un problema con gli input non dovrebbe causare il crash di un'eccezione non rilevata. È molto meglio produrre qualcosa di remotamente sensato (anche se, in senso stretto, errato) piuttosto che chiudere.
Se stai scrivendo un'applicazione in cui la correttezza è importante (come il business o il software di progettazione), questo sarebbe un approccio terribile. Se ti sei dimenticato di qualche scenario che aumenta ValueError
, la cosa peggiore che puoi fare è ignorare silenziosamente questo scenario sconosciuto e saltare semplicemente la linea. Ecco come finiscono nel software degli errori molto sottili e costosi.
Potresti pensare che l'unico modo in cui puoi vedere ValueError
in questo codice, è se split
ha restituito solo un valore (invece di due). Ma cosa succede se la tua dichiarazione print
in seguito inizia a utilizzare un'espressione che aumenta ValueError
in alcune condizioni? Questo ti farà saltare alcune righe non perché manchino :
, ma perché print
non riesce su di esse. Questo è un esempio di un bug sottile a cui mi riferivo prima - non ti accorgerai di nulla, perdi solo alcune righe.
La mia raccomandazione è di evitare l'intercettazione (ma non il sollevamento!) delle eccezioni nel codice in cui produrre output errati è peggio che uscire. L'unica volta in cui rilevo un'eccezione in tale codice è quando ho un'espressione veramente banale, quindi posso facilmente ragionare su cosa potrebbe causare ciascuno dei possibili tipi di eccezione.
Per quanto riguarda l'impatto sulle prestazioni dell'uso di eccezioni, è banale (in Python) a meno che non si incontrino frequentemente eccezioni.
Se si utilizzano le eccezioni per gestire le condizioni ricorrenti di routine, in alcuni casi è possibile che si paghi un costo elevato per le prestazioni. Ad esempio, supponiamo di eseguire in remoto alcuni comandi. È possibile verificare che il testo del comando superi almeno la convalida minima (ad es. Sintassi). Oppure puoi aspettare che venga sollevata un'eccezione (che accade solo dopo che il server remoto ha analizzato il tuo comando e trovato un problema con esso). Ovviamente, il primo è un ordine di grandezza più veloce. Un altro semplice esempio: puoi verificare se un numero è zero ~ 10 volte più veloce rispetto a provare a eseguire la divisione e quindi a rilevare l'eccezione ZeroDivisionError.
Queste considerazioni sono importanti solo se invii frequentemente stringhe di comandi malformate a server remoti o ricevi argomenti a valore zero che usi per la divisione.
Nota: presumo che useresti except ValueError
invece del solo except
; come altri hanno sottolineato, e come dice il libro stesso in poche pagine, non dovresti mai usare except
nuda.
Un'altra nota: l'approccio corretto non-eccezione consiste nel contare il numero di valori restituiti da split
, piuttosto che cercare :
. Quest'ultimo è troppo lento, poiché ripete il lavoro svolto da split
e potrebbe quasi raddoppiare il tempo di esecuzione.