try - Atrapando todas las excepciones en Python
validar division por 0 en python (3)
Para evitar el enmascaramiento de las excepciones básicas, debe "volver a elevar" cualquier excepción que no sea la que desea controlar explícitamente, por ejemplo (adaptado de 8. Errores y excepciones ):
import sys
try: # do something that could throw an exception: 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: # maybe log the exception (e.g. in debug mode) # re-raise the exception: raise
En Python, ¿cuál es la mejor manera de detectar "todas" las excepciones?
except: # do stuff with sys.exc_info()[1]
except BaseException as exc:
except Exception as exc:
La captura puede estar ejecutando en un hilo.
Mi objetivo es registrar cualquier excepción que pueda ser lanzada por un código normal sin enmascarar ninguna excepción especial de Python, como aquellas que indican la terminación del proceso, etc.
También es conveniente obtener un identificador de la excepción (como las cláusulas anteriores que contienen exc
).
Si necesitas capturar todas las excepciones y hacer lo mismo para todos, te sugeriré esto:
try:
#stuff
except:
# do some stuff
Si no desea enmascarar las excepciones "especiales" de Python, use la clase base Exception
try:
#stuff
except Exception:
# do some stuff
para algunas excepciones relacionadas con la gestión, capturarlos explícitamente:
try:
#stuff
except FirstExceptionBaseClassYouWantToCatch as exc:
# do some stuff
except SecondExceptionBaseClassYouWantToCatch as exc:
# do some other stuff based
except (ThirdExceptionBaseClassYouWantToCatch, FourthExceptionBaseClassYouWantToCatch) as exc:
# do some other stuff based
La jerarquía de excepciones de los documentos de Python debería ser una lectura útil.
except Exception:
vsexcept BaseException:
:La diferencia entre la captura de
Exception
yBaseException
es que, de acuerdo con la excepción de la jerarquía de excepciones, como SystemExit, KeyboardInterrupt y GeneratorExit, no se detectarán cuando se usen,except Exception
porque se heredan directamente deBaseException
.except:
vsexcept BaseException:
:La diferencia entre estos dos está principalmente en python 2 (AFAIK), y solo cuando se usa una clase de estilo antiguo como una excepción para ser levantada, en este caso solo la cláusula sin expresiones excepto podrá capturar la excepción, por ejemplo.
class NewStyleException(Exception): pass try: raise NewStyleException except BaseException: print "Caught" class OldStyleException: pass try: raise OldStyleException except BaseException: print "BaseException caught when raising OldStyleException" except: print "Caught"