L'argomento principale del libro è che la versione di eccezione del codice è migliore perché catturerà tutto ciò che potresti aver trascurato se provassi a scrivere il tuo controllo degli errori.
Penso che questa affermazione sia vera solo in circostanze molto specifiche - in cui non ti importa se l'output è corretto.
Non c'è dubbio che sollevare eccezioni è una pratica solida 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 la cattura di eccezioni. Se si cattura un'eccezione, si sta non proteggersi da scenari si potrebbe avere trascurato. Stai facendo esattamente il contrario: supponi di non aver trascurato nessuno scenario che potrebbe aver causato questo tipo di eccezione, e quindi sei sicuro che sia corretto catturarlo (e quindi impedirgli di causare l'uscita dal programma, come qualsiasi eccezione non rilevata).
Utilizzando l'approccio delle eccezioni, se vedi ValueError
un'eccezione, salti una riga. Usando il tradizionale approccio senza eccezioni, conti il numero di valori restituiti da split
e se è inferiore a 2, salti una riga. Dovresti sentirti più sicuro con l'approccio delle eccezioni, dal momento che potresti aver dimenticato alcune altre situazioni di "errore" nel tuo tradizionale controllo degli errori e le except ValueError
avresti prese per te?
Questo 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 un arresto anomalo con un'eccezione non rilevata. È molto meglio produrre qualcosa di sensibilmente remoto (anche se, a rigore, errato) piuttosto che smettere.
Se stai scrivendo un'applicazione in cui la correttezza è importante (come software aziendali o di ingegneria), questo sarebbe un approccio terribile. Se ti sei dimenticato di uno scenario che genera ValueError
, la cosa peggiore che puoi fare è ignorare silenziosamente questo scenario sconosciuto e semplicemente saltare la linea. Ecco come i bug molto sottili e costosi finiscono nel software.
Potresti pensare che l'unico modo in cui puoi vedere ValueError
in questo codice, è se split
restituito solo un valore (anziché due). Ma cosa succede se la tua print
affermazione in seguito inizia a utilizzare un'espressione che si solleva ValueError
in alcune condizioni? Questo ti farà saltare alcune linee non perché mancano :
, ma perché print
falliscono su di esse. Questo è un esempio di un bug sottile a cui mi riferivo prima: non noteresti nulla, perdi solo alcune righe.
La mia raccomandazione è di evitare di catturare (ma non sollevare!) 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 davvero banale, quindi posso facilmente ragionare su ciò che può causare ciascuno dei possibili tipi di eccezione.
Per quanto riguarda l'impatto sulle prestazioni dell'uso delle eccezioni, è banale (in Python) a meno che non si incontrino frequentemente eccezioni.
Se si utilizzano eccezioni per gestire le condizioni che si verificano abitualmente, in alcuni casi è possibile che si paghino costi di prestazioni enormi. Ad esempio, supponiamo di eseguire qualche comando in remoto. È possibile verificare che il testo del comando superi almeno la convalida minima (ad es. Sintassi). Oppure potresti aspettare che venga sollevata un'eccezione (che si verifica solo dopo che il server remoto analizza il tuo comando e trova un problema con esso). Ovviamente, il primo è ordini di grandezza più veloci. Un altro semplice esempio: è possibile verificare se un numero è zero ~ 10 volte più veloce rispetto al tentativo di eseguire la divisione e quindi rilevare l'eccezione ZeroDivisionError.
Queste considerazioni sono importanti solo se si inviano frequentemente stringhe di comando non valide ai server remoti o si ricevono argomenti a valore zero che si utilizzano per la divisione.
Nota: suppongo che useresti al except ValueError
posto del giusto except
; come altri hanno sottolineato, e come dice il libro stesso in poche pagine, non si dovrebbe mai usare nudo except
.
Un'altra nota: l'approccio corretto senza eccezioni è quello di contare il numero di valori restituiti split
, piuttosto che cercare :
. Quest'ultimo è troppo lento, poiché ripete il lavoro svolto split
e potrebbe quasi raddoppiare i tempi di esecuzione.