20

En Python, ¿cuál es la mejor forma de atrapar excepciones "todas"?Captura de todas las excepciones en Python

except: # do stuff with sys.exc_info()[1] 

except BaseException as exc: 

except Exception as exc: 

La captura puede estar ejecutándose en una secuencia.

Mi objetivo es registrar cualquier excepción que pueda arrojar por código normal sin enmascarar cualquier excepción Python especiales, como los que indican proceso de terminación, etc.

Conseguir una manija a la excepción (como por las cláusulas arriba que contiene exc) también es deseable.

Respuesta

20

Si necesita capturar todas las excepciones y hacer lo mismo para todos, voy a sugerir esto:

try: 
    #stuff 
except: 
    # do some stuff 

Si no desea enmascarar excepciones "especiales" Python, utilizar la excepción clase base

try: 
    #stuff 
except Exception: 
    # do some stuff 

algunas excepciones relacionadas con la gestión, capturarlos de forma explícita:

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 

El exception hierarchy de los documentos de python debería ser una lectura útil.

+1

Gracias por el enlace a la jerarquía de excepciones. :) – EOL

0

Para evitar el enmascaramiento de las excepciones básicas, debe "volver a plantear" las excepciones que no sean explícitamente deseadas, p. Ej. (Adaptado de 8. Errors and Exceptions):

 
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

+1

El final 'except: raise' no hace nada: se puede omitir por completo; las excepciones non-IOError y non-ValueError simplemente no son atrapadas y son creadas automáticamente por el intérprete. – EOL

+1

@EOL Tienes razón. He editado mi respuesta para indicar por qué la final excepto: podría ser útil. – Peter

29
  • except Exception: vs except BaseException::

    La diferencia entre la captura Exception y BaseException es que de acuerdo con la exception hierarchy excepción como SystemExit, KeyboardInterrupt y GeneratorExit no podrá ser pescada cuando usa except Exception porque heredan directamente de BaseException.

  • except: vs except BaseException::

    La diferencia entre esta dos es principalmente en pitón 2 (AFAIK), y es sólo cuando se utiliza una clase de estilo antiguo como una excepción a ser elevado, en este caso sólo la expresión-menos excepto la cláusula podrá atrapar la excepción, por ej.

    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" 
    
+2

Hice que 'NewStyleException' heredara de' Exception', como se recomienda oficialmente (http://docs.python.org/tutorial/errors.html#user-defined-exceptions). – EOL

Cuestiones relacionadas