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,SystemExity cosas así, que se derivan directamente deexceptions.BaseException, noexceptions.Exception.Consulte la documentación para más detalles:
trydeclaraciónfuente
try: shuti.rmtree(...) except: passsuprimirá crudamente cualquier error (incluso sishutilNameErrorexcept OSError:En general, se considera una práctica recomendada detectar solo los errores que le interesan. En el caso de
shutil.rmtreeque 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
Exceptionlugar de unaexcept:declaración simple . De nuevo por qué?Al no especificar una excepción, se detectan todas las excepciones, incluida la
SystemExitexcepció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
OSErrorexcepció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.rmtreeno es el mejor ejemplo, porque solo loignore_errors=TrueDepende 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
suppressadministrador de contexto:Pero solo suprima la excepción más específica:
Ignorarás silenciosamente un
FileNotFoundError:De los documentos :
Tenga en cuenta que
suppressyFileNotFoundErrorsolo 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,
passes 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,KeyboardInterruptySystemExit, 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
errnobiblioteca 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
passcon 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
elseen este contexto. Y añadir quefinallyserá 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.