2009-02-22 21 views
239

Intento ... excepto bloque en mi código y cuando se lanza una excepción. Realmente solo quiero continuar con el código porque en ese caso, todo sigue funcionando perfectamente. El problema es si deja el bloque except: block vacío o con un #do nothing, le da un error de sintaxis. No puedo usar Continuar porque no está en un bucle. ¿Hay alguna palabra clave que pueda usar que indique al código que solo continúe?Python: cómo ignorar una excepción y continuar?

Respuesta

359
except: 
    pass 
+64

excepto Excepción: pase # importante no tragar otras excepciones! –

+8

@ Aaron - Estoy de acuerdo, pero la pregunta no era si esta era una idea buena/mala – David

+15

Esto capturará SystemExit, KeyboardInterrupt y otras cosas que probablemente no quiera atrapar. – FogleBird

12

Prueba esto:

try: 
    blah() 
except: 
    pass 
202

La norma de "nop" en Python es el pass declaración:

try: 
    do_something() 
except Exception: 
    pass 

Debido a la última excepción lanzada ser recordado en Python, algunas de las los objetos implicados en la declaración de lanzamiento de excepción se mantienen en vivo indefinidamente (en realidad, hasta la próxima excepción). En caso de que esto es importante para usted y (por lo general) que no es necesario recordar la última excepción lanzada, es posible que desee hacer lo siguiente en lugar de pass:

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

Esto borra la última excepción lanzada.

+26

Esta es una respuesta mejor que la que se aceptó porque usa "excepto Excepción:" en lugar de solo "excepto:" que, como han señalado otros, tragará incorrectamente otras cosas que no desea atrapar como SystemExit y KeyboardInterrupt . – aculich

+4

+1 También borra el error que es importante cuando se ejecutan unittests y esperando excepciones – geographika

+0

Tenga en cuenta que 'exc_clear' se eliminó en python 3. https: // docs.python.org/3/whatsnew/3.0.html#index-22. Para algunas formas de abordar esto en Python 3, consulte aquí: https://cosmicpercolator.com/2016/01/13/exception-leaks-in-python-2-and-3/ – bcattle

114

Hay una nueva manera de hacer esto viene en Python 3.4:

from contextlib import suppress 

with suppress(Exception): 
    # your code 

Aquí es realizar la confirmación que añade que: http://hg.python.org/cpython/rev/406b47c64480

Y aquí está el autor, Raymond Hettinger, hablando de esto y todo tipo de otra picor Python (poco relevante en 43:30): http://www.youtube.com/watch?v=OSGv2VnC0go

Si quería emular al desnudo except palabra clave y también ignorar cosas como KeyboardInterrupt -aunque que muchas veces no-usted podría use with suppress(BaseException).

Editar: Parece que ignored se renombró a suppress antes de la versión 3.4.

+1

No estoy seguro de que me guste esta solución ... Supongo que la idea es que hayamos reemplazado 3 líneas con solo 1 (la prueba, excepto, y el pase están todos fusionados en uno). Lo principal a lo que me opongo es cómo esto introduce una nueva palabra clave que parece reivindicar algo probablemente no deberías estarlo ... parece que siempre debes registrar al menos las excepciones que atrapas ... – ArtOfWarfare

+0

Cuando se produce una excepción, continúa el código después de la prueba/captura o lo que sea que esté fuera del ' con 'bloque? – Mikhail

+1

Esto es equivalente a envolver su código en un 'try ... catch: pass', por lo que si se produce una excepción dentro del bloque, la ejecución continuará después del final del bloque. –

Cuestiones relacionadas