Cuando solo quieres probar, excepto sin manejar la excepción, ¿cómo lo haces en Python?
¿Es la siguiente la forma correcta de hacerlo?
try:
shutil.rmtree(path)
except:
pass
python
exception
try-except
Joan Venge
fuente
fuente
shutil.rmtree(path, ignore_errors=True)
. Sin embargo, esto no se aplicará a la mayoría de las funciones.try: rob() except: run()
Respuestas:
o
La diferencia es que el primero también atrapará
KeyboardInterrupt
,SystemExit
y cosas así, que se derivan directamente deexceptions.BaseException
, noexceptions.Exception
.Consulte la documentación para más detalles:
try
declaraciónfuente
try: shuti.rmtree(...) except: pass
suprimirá crudamente cualquier error (incluso sishutil
NameError
except OSError:
En general, se considera una práctica recomendada detectar solo los errores que le interesan. En el caso de
shutil.rmtree
que sea probableOSError
:Si quiere ignorar silenciosamente ese error, haría:
¿Por qué? Digamos que (de alguna manera) accidentalmente pasa la función a un entero en lugar de una cadena, como:
Aparecerá el error "TypeError: coaccionar a Unicode: necesita cadena o buffer, int encontrado" - probablemente no quiera ignorar eso, lo que puede ser difícil de depurar.
Si definitivamente desea ignorar todos los errores, capture en
Exception
lugar de unaexcept:
declaración simple . De nuevo por qué?Al no especificar una excepción, se detectan todas las excepciones, incluida la
SystemExit
excepción que, por ejemplo,sys.exit()
utiliza:Compare esto con lo siguiente, que sale correctamente:
Si desea escribir un código de comportamiento cada vez mejor, la
OSError
excepción puede representar varios errores, pero en el ejemplo anterior solo queremos ignorarErrno 2
, por lo que podríamos ser aún más específicos:fuente
shutil.rmtree
no es el mejor ejemplo, porque solo loignore_errors=True
Depende de lo que quieras decir con "manipulación".
Si quiere atraparlo sin realizar ninguna acción, el código que publicó funcionará.
Si quiere decir que desea tomar medidas sobre una excepción sin detener la subida de la excepción, entonces quiere algo como esto:
fuente
Primero cito la respuesta de Jack O'Connor de este hilo . El hilo de referencia se cerró, así que escribo aquí:
"Hay una nueva forma de hacer esto en Python 3.4:
Aquí está el commit que lo agregó: http://hg.python.org/cpython/rev/406b47c64480
Y aquí está el autor, Raymond Hettinger, hablando sobre esto y todo tipo de otras características de Python: https://youtu.be/OSGv2VnC0go?t=43m23s
Mi adición a esto es el equivalente a Python 2.7:
Luego lo usas como en Python 3.4:
fuente
Por completitud:
También tenga en cuenta que puede capturar la excepción de esta manera:
... y vuelve a plantear la excepción así:
... ejemplos del tutorial de Python .
fuente
Hay varias maneras de hacer esto.
Sin embargo, la elección del ejemplo tiene una solución simple que no cubre el caso general.
Específico para el ejemplo:
En vez de
Hacer esto:
Este es un argumento específico para
shutil.rmtree
. Puede ver la ayuda al hacer lo siguiente, y verá que también puede permitir la funcionalidad en los errores.Como esto solo cubre el caso estrecho del ejemplo, demostraré aún más cómo manejar esto si esos argumentos de palabras clave no existieran.
Enfoque general
Dado que lo anterior solo cubre el caso estrecho del ejemplo, demostraré aún más cómo manejar esto si esos argumentos de palabras clave no existieran.
Nuevo en Python 3.4:
Puede importar el
suppress
administrador de contexto:Pero solo suprima la excepción más específica:
Ignorarás silenciosamente un
FileNotFoundError
:De los documentos :
Tenga en cuenta que
suppress
yFileNotFoundError
solo están disponibles en Python 3.Si desea que su código también funcione en Python 2, consulte la siguiente sección:
Python 2 y 3:
Para el código compatible con Python 2,
pass
es la forma correcta de tener una declaración que no sea operativa. Pero cuando se hace una desnudaexcept:
, eso es lo mismo que hacerexcept BaseException:
que incluyeGeneratorExit
,KeyboardInterrupt
ySystemExit
, y, en general, que no quieren coger esas cosas.De hecho, debe ser tan específico al nombrar la excepción como sea posible.
Aquí hay parte de la jerarquía de excepciones de Python (2) y, como puede ver, si detecta Excepciones más generales, puede ocultar problemas que no esperaba:
Probablemente desee capturar un OSError aquí, y tal vez la excepción que no le importa es si no hay un directorio.
Podemos obtener ese número de error específico de la
errno
biblioteca y volver a subirlo si no tenemos eso:Tenga en cuenta que un aumento simple genera la excepción original, que probablemente es lo que desea en este caso. Escrito de manera más concisa, ya que realmente no necesitamos explícitamente
pass
con el código en el manejo de excepciones:fuente
Esto lo ayudará a imprimir cuál es la excepción :( es decir, intente capturar sin manejar la excepción e imprima la excepción).
fuente
Para su información, la cláusula else puede ir después de todas las excepciones y solo se ejecutará si el código en el intento no causa una excepción.
fuente
else
en este contexto. Y añadir quefinally
será siempre correr detrás de cualquiera (o no es una excepción).Necesitaba ignorar los errores en múltiples comandos y eso fue lo que hice.
fuente
En Python, manejamos excepciones similares a otro lenguaje, pero la diferencia es alguna diferencia de sintaxis, por ejemplo,
fuente
Usualmente solo hago:
fuente
_ = ""
conpass
.