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
except:
pass
Prova questo:
try:
blah()
except:
pass
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.
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
+1 Elimina anche l'errore che è importante quando si eseguono le unittest e si aspettano eccezioni – geographika
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
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.
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
Quando un'eccezione viene sollevata, continuerà il codice dopo il try/catch o qualunque cosa sia al di fuori del ' con' block? – Mikhail
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. –
eccetto eccezione: pass # importante non ingerire altre eccezioni! –
@Aaron - Sono d'accordo, ma la domanda non era se questa era una buona/cattiva idea – David
Questo prenderà SystemExit, KeyboardInterrupt e altre cose che probabilmente non vuoi catturare. – FogleBird