¿Cómo puedo escribir un try/ exceptbloque que capture todas las excepciones?
fuente
¿Cómo puedo escribir un try/ exceptbloque que capture todas las excepciones?
Puedes pero probablemente no deberías:
try:
do_something()
except:
print "Caught it!"
Sin embargo, esto también detectará excepciones como KeyboardInterrupty generalmente no quieres eso, ¿verdad? A menos que vuelva a aumentar la excepción de inmediato, consulte el siguiente ejemplo de los documentos :
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
except Exception:lo desnudo, excepto que también tendrá que capturar las Excepciones Base.
Además de una except:cláusula simple (que como otros han dicho que no debe usar), simplemente puede atrapar Exception:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
Normalmente, solo consideraría hacer esto en el nivel más externo de su código si, por ejemplo, desea manejar cualquier excepción no detectada antes de finalizar.
La ventaja de except ExceptionOver the bare exceptes que hay algunas excepciones que no atraparán, más obviamente KeyboardInterrupty SystemExit: si las atrapó y se las tragó, podría dificultar que cualquiera salga de su script.
Exception. Tenga en cuenta que es imposible plantear un intcomo una excepción, e intentar hacerlo genera una TypeErrorexcepción, que es lo que sería captado por la except Exceptioncláusula adjunta en tal caso. Por otro lado, una clase de estilo antiguo se puede generar y califica como una "no excepción" que no es una subclase Exception; esto se captará con una exceptcláusula simple pero no con una except Exceptioncláusula.
TypeError
sys.exit()generalmente significa que espera que la aplicación finalice, pero si atrapa SystemExit no lo hará. Del mismo modo, si presiona control-C en un script en ejecución (Ctrl-break en Windows), espera que el programa se detenga, no detecte el error y continúe. Pero puede atrapar cualquiera / ambos de estos si desea hacer la limpieza antes de existir.
Puede hacer esto para manejar excepciones generales
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
Para capturar todas las excepciones posibles, captura BaseException. Está en la parte superior de la jerarquía de excepciones:
Python 3: https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy
Python 2.7: https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
Pero como otras personas mencionaron, generalmente no necesitaría esto, solo para casos específicos.
Ejemplo muy simple, similar al que se encuentra aquí:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
Si está intentando atrapar TODAS las excepciones, coloque todo su código dentro de la instrucción "try:", en lugar de 'print "Realizando una acción que puede lanzar una excepción".
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
En el ejemplo anterior, vería la salida en este orden:
1) Realizar una acción que puede arrojar una excepción.
2) Finalmente se llama directamente después de ejecutar la declaración de prueba, ya sea que se lance una excepción o no.
3) "¡Se produjo una excepción!" o "¡Todo se ve genial!" dependiendo de si se lanzó una excepción.
¡Espero que esto ayude!
Hay varias formas de hacer esto en particular con Python 3.0 y superior
Enfoque 1
Este es un enfoque simple pero no recomendado porque no sabría exactamente qué línea de código está lanzando realmente la excepción:
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
Enfoque 2
Se recomienda este enfoque porque proporciona más detalles sobre cada excepción. Incluye:
El único inconveniente es que el tracback debe importarse.
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
Acabo de descubrir este pequeño truco para probar si hay nombres de excepción en Python 2.7. A veces he manejado excepciones específicas en el código, por lo que necesitaba una prueba para ver si ese nombre está dentro de una lista de excepciones manejadas.
try:
raise IndexError #as test error
except Exception as e:
excepName = type(e).__name__ # returns the name of the exception
try:
whatever()
except:
# this will catch any exception or error
Vale la pena mencionar que esto no es una codificación Python adecuada. Esto detectará también muchos errores que quizás no desee detectar.
sys.stderry posiblemente se registran los mensajes de error detectados . Esa es una excepción perfectamente válida y común.try: whatever() except Exception as e: exp_capture():?