2011-01-13 4 views
5

Quando li usi? Trovo che sto usando se è molto più delle eccezioni. Sembra che io stia prendendo le eccezioni usando i miei "se", prima ancora di averli. Ci sono if in tutto il mio codice.Quando è necessario verificare la presenza di errori utilizzando "if" e quando si devono utilizzare le eccezioni?

+1

Questo è stato chiesto infinite volte (2739582, 1152541, 1313812). Tra questa domanda, la tua domanda 4557577 (e senza dubbio innumerevoli altre) e le tue oltre ottocento domande *, sembra che tu sia una specie di spammer di domande. –

risposta

2

Le istruzioni catch sono progettate per gestire errori gravi e in particolare per la connessione a servizi esterni come un servizio Web, database, richiesta Web e così via dove si verificano e si prevede che si verifichino di tanto in tanto errori. È più pesante sull'ambiente di runtime gestire un'eccezione, piuttosto che scrivere codice valido e utilizzare le funzionalità del linguaggio specifico come if o operazione ternaria.

i tentativi di cattura non sono la prima linea di difesa, sono l'ultima riga che utilizza le pratiche di codifica difensive.

1

Soprattutto quando si lavora con applicazioni di grandi dimensioni, la gestione delle eccezioni è davvero una pratica migliore. Come hai detto, stai ricevendo molte affermazioni. Con python, l'uso delle istruzioni try/except consente di creare un modo più standardizzato di gestire le eccezioni. Con le eccezioni, avrai il vantaggio di vedere il tipo di classe di eccezioni e qualsiasi altra personalizzata che costruisci. Ti dà solo un modo molto più strutturato di codifica.

4

EAFP: Easier to ask for forgiveness than permission.

E 'comune stile di codifica Python per assumere l'esistenza di chiavi valide o attributi ed eccezioni di cattura, se l'ipotesi si rivela falsa.

Questo contrasta con lo stile LBYL (Look before you leap) comune a molti altri linguaggi come C.

Update 1

Naturalmente, è necessario assicurarsi di gestire eccezioni catturati e non solo in silenzio ignorarli altrimenti perderai un sacco di tempo per il debugging! pass probabilmente non è quello che stai cercando!

Update 2

si potrebbe intercettare le eccezioni specifiche che siete in attesa essere raise -d, siano essi built-in exceptions o in altro modo.

+0

Ho provato generico: tranne Exceptione,: print e pass E 'questo? – TIMEX

+0

@TIMEX: non esiste una risposta generica qui. Il modo in cui gestisci l'eccezione dipende dall'elaborazione che stavi facendo quando era 'raise' -d. Detto questo, il passaggio è molto raramente quello che vuoi! – Johnsyweb

+1

Vale la pena notare che l'uso dell'eccezione di gestione contro le istruzioni 'if' dice al lettore del codice qualcosa su ciò che si aspetta che accada. Un'istruzione 'if' implica che esiste una possibilità considerevole che la condizione sia 'True' o' False', mentre 'try' /' except' implica il trattamento dei casi limite. Quindi, mentre EAFP può essere un python idematico, in un dato caso c'è spazio per l'interpretazione. Inoltre, non dovresti mai usare mai generici 'except Exception'. – Wilduck

2

Non sto a ripetere ciò che molte persone hanno già detto, ma c'è un grande vantaggio di utilizzare eccezioni che vorrei citare:

Se alcuni di routine non riesce, si può facilmente decidere su quale livello di Indirizzamento indiretto si dovrebbe gestire tale eccezione - e non sarà necessario gonfiare i livelli più profondi con il controllo degli errori dopo, ad esempio, ogni passo.

Ovviamente questo non ti libera dalla responsabilità di avere un buon codice di pulizia che lascerà tutto chiaro per ogni possibile percorso di esecuzione: in modo da liberare qualsiasi risorsa, socket, commit o transazioni di rollback, ecc.E ci sono molti mezzi per farlo:

  • try... finally blocchi, consentendo ad ogni eccezione a propagare ma pulizia tutto prima (molte lingue, tra cui Python),
  • il with economico (specifico per Python),
  • il paradigma RAII che implica la pulizia dei distruttori (principalmente C++).
Problemi correlati