¿Cómo puedo escribir un bloque `try`/`except` que detecte todas las excepciones?

Resuelto user469652 asked hace 13 años • 10 respuestas

¿ Cómo puedo escribir un bloque try/ exceptque detecte todas las excepciones?

user469652 avatar Feb 14 '11 16:02 user469652
Aceptado

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 Exceptionsobre lo básico exceptes que hay algunas excepciones que no detectará, la más obvia KeyboardInterrupt: SystemExitsi las detecta y las traga, podría dificultar que cualquiera salga de su secuencia de comandos.

Duncan avatar Feb 14 '2011 12:02 Duncan

Puedes, pero probablemente no deberías:

try:
    do_something()
except:
    print("Caught it!")

Sin embargo, esto también detectará excepciones como KeyboardInterruptlas 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
Tim Pietzcker avatar Feb 14 '2011 09:02 Tim Pietzcker

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.

gitaarik avatar Jul 24 '2015 11:07 gitaarik

Puedes hacer esto para manejar excepciones generales.

try:
    a = 2/0
except Exception as e:
    print e.__doc__
    print e.message
vwvolodya avatar Jul 14 '2013 19:07 vwvolodya