¿Cómo puedo escribir un bloque `try`/`except` que detecte todas las excepciones?
¿ Cómo puedo escribir un bloque try
/ except
que detecte todas las excepciones?
Aparte de una except:
cláusula básica (que, como otros han dicho, no deberías usar), simplemente puedes capturar 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, quisiera manejar cualquier excepción no detectada antes de terminar.
La ventaja de except Exception
sobre lo básico except
es que hay algunas excepciones que no detectará, la más obvia KeyboardInterrupt
: SystemExit
si las detecta y las traga, podría dificultar que cualquiera salga de su secuencia de comandos.
Puedes, pero probablemente no deberías:
try:
do_something()
except:
print("Caught it!")
Sin embargo, esto también detectará excepciones como KeyboardInterrupt
las que normalmente no deseas, ¿verdad? A menos que vuelva a generar 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
Para detectar todas las excepciones posibles, capture BaseException
. Está en la cima de la jerarquía de clases de excepción:
Python 3: https://docs.python.org/3.12/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 mencionaron otras personas, normalmente no sería necesario esto, sólo para casos muy específicos.
Puedes hacer esto para manejar excepciones generales.
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message