2009-02-22 24 views
239

Ho una prova ... eccetto il blocco nel mio codice e quando viene lanciata un'eccezione. Voglio solo continuare con il codice perché in quel caso, tutto è ancora in grado di funzionare bene. Il problema è che se si lascia il blocco tranne: vuoto o con #do nulla, si ha un errore di sintassi. Non posso continuare a utilizzare perché non è in un ciclo. C'è una parola chiave che posso usare che dice al codice di andare avanti?Python: come ignorare un'eccezione e procedere?

risposta

359
except: 
    pass 
+64

eccetto eccezione: pass # importante non ingerire altre eccezioni! –

+8

@Aaron - Sono d'accordo, ma la domanda non era se questa era una buona/cattiva idea – David

+15

Questo prenderà SystemExit, KeyboardInterrupt e altre cose che probabilmente non vuoi catturare. – FogleBird

12

Prova questo:

try: 
    blah() 
except: 
    pass 
202

Lo standard "NOP" in Python è la dichiarazione pass:

try: 
    do_something() 
except Exception: 
    pass 

A causa degli ultimi eccezione generata essere ricordato in Python, alcuni dei gli oggetti coinvolti nella dichiarazione di lancio delle eccezioni vengono mantenuti dal vivo indefinitamente (in realtà, fino alla prossima eccezione). Nel caso in cui questo è importante per voi e (in genere) non c'è bisogno di ricordare l'ultima eccezione generata, si potrebbe desiderare di effettuare le seguenti operazioni, invece di pass:

try: 
    do_something() 
except Exception: 
    sys.exc_clear() 

questo cancella l'ultima eccezione generata.

+26

Questa è una risposta migliore rispetto a quella accettata perché utilizza "tranne Eccezione:" invece di solo "tranne:" che, come altri hanno sottolineato, ingerisce in modo improprio altre cose che non vuoi prendere come SystemExit e KeyboardInterrupt . – aculich

+4

+1 Elimina anche l'errore che è importante quando si eseguono le unittest e si aspettano eccezioni – geographika

+0

Si noti che 'exc_clear' è stato rimosso in python 3. https: // docs.python.org/3/whatsnew/3.0.html#index-22. Per alcuni modi per risolvere questo problema in Python 3 vedere qui: https://cosmicpercolator.com/2016/01/13/exception-leaks-in-python-2-and-3/ – bcattle

114

C'è un nuovo modo per farlo venire in Python 3.4:

from contextlib import suppress 

with suppress(Exception): 
    # your code 

Ecco il commit che hanno aggiunto: http://hg.python.org/cpython/rev/406b47c64480

Ed ecco l'autore, Raymond Hettinger, parlando del più e tutti i tipi di altro piccante Python (bit rilevanti a 43:30): http://www.youtube.com/watch?v=OSGv2VnC0go

Se si voleva emulare la parola chiave except nuda e anche ignorare le cose come KeyboardInterrupt -anche se si spesso non-si potrebbe utilizzare with suppress(BaseException).

Modifica: Sembra che ignored sia stato rinominato suppress prima della versione 3.4.

+1

Non sono sicuro che mi piace questa soluzione ... Immagino che l'idea è che abbiamo sostituito 3 righe con solo 1 (il try, tranne, e pass sono tutti uniti in uno solo.) La cosa principale che mi oppongo è come questo introduce una nuova parola chiave che sembra confermare qualcosa probabilmente non dovresti farlo ... sembra che dovresti sempre registrare almeno le eccezioni che stai intercettando ... – ArtOfWarfare

+0

Quando un'eccezione viene sollevata, continuerà il codice dopo il try/catch o qualunque cosa sia al di fuori del ' con' block? – Mikhail

+1

Questo è equivalente al wrapping del codice in un 'try ... catch: pass', quindi se viene sollevata un'eccezione all'interno del blocco, l'esecuzione continuerà dopo la fine del blocco. –