¿Cómo imprimir una excepción en Python?

Respuestas:

1064

Para Python 2.6 y posterior y Python 3.x:

except Exception as e: print(e)

Para Python 2.5 y anteriores, use:

except Exception,e: print str(e)
jldupont
fuente
41
str( KeyError('bad'))=> 'bad'- no dice el tipo de excepción
Dave
10
print (e) en keyerrors parece dar solo la clave, pero no el mensaje de excepción completo, lo cual es poco útil.
Veggiet
14
Si va a imprimir la excepción, es mejor usarla print(repr(e)); la Exception.__str__implementación base solo devuelve el mensaje de excepción, no el tipo. O utilice el tracebackmódulo, que tiene métodos para imprimir la excepción actual, formateada o el rastreo completo.
Martijn Pieters
453

El tracebackmódulo proporciona métodos para formatear e imprimir excepciones y sus trazas, por ejemplo, esto imprimiría una excepción como lo hace el controlador predeterminado:

import traceback

try:
    1/0
except Exception:
    traceback.print_exc()

Salida:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero
Cat Plus Plus
fuente
44
¿Hay algún tipo de llamada get_error_message que pueda imprimir ya que estoy usando mi propia rutina de impresión para agregar algunas otras cosas?
MikeSchem el
11
@MikeSchem error_message = traceback.format_exc()
heyzling
3
Gracias, este es el que quería. Todo el rastro, y no sólo el tipo de error y el mensaje
Ken Bellows
Este recorte no utiliza el objeto de excepción capturado. ¿Puedes expandir el código para usar 'ex'? - como en except Exception as ex:...
aaronsteers
@aaronsteers usa la excepción capturada; en un controlador de excepciones, la excepción actual está disponible a través de la sys.exc_info()función y la traceback.print_exc()función la obtiene desde allí. Solo necesita pasar una excepción explícitamente cuando no maneja una excepción o cuando desea mostrar información basada en una excepción diferente.
Martijn Pieters
169

En Python 2.6 o superior es un poco más limpio:

except Exception as e: print(e)

En versiones anteriores todavía es bastante legible:

except Exception, e: print e
ilya n.
fuente
15
En python3, debe usar la 1ra forma, con "as".
Sam Watkins
53

En caso de que desee pasar cadenas de error, aquí hay un ejemplo de Errores y Excepciones (Python 2.6)

>>> try:
...    raise Exception('spam', 'eggs')
... except Exception as inst:
...    print type(inst)     # the exception instance
...    print inst.args      # arguments stored in .args
...    print inst           # __str__ allows args to printed directly
...    x, y = inst          # __getitem__ allows args to be unpacked directly
...    print 'x =', x
...    print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
Nick Dandoulakis
fuente
38

(Iba a dejar esto como un comentario sobre la respuesta de @ jldupont, pero no tengo suficiente reputación).

También he visto respuestas como la respuesta de @ jldupont en otros lugares. FWIW, creo que es importante tener en cuenta que esto:

except Exception as e:
    print(e)

imprimirá la salida de error sys.stdoutpor defecto. Un enfoque más apropiado para el manejo de errores en general sería:

except Exception as e:
    print(e, file=sys.stderr)

(Tenga en cuenta que tiene que hacerlo import syspara que esto funcione). De esta manera, el error se imprime en STDERRlugar de STDOUT, lo que permite el análisis / redirección de salida / etc. Entiendo que la pregunta era estrictamente sobre 'imprimir un error', pero parece importante señalar la mejor práctica aquí en lugar de omitir este detalle que podría conducir a un código no estándar para cualquiera que eventualmente no aprenda mejor.

No he usado el tracebackmódulo como en la respuesta de Cat Plus Plus, y tal vez esa sea la mejor manera, pero pensé en lanzar esto.

grish
fuente
1
Sugeriría agregar más flush = True. Me he dado cuenta con systemd (y no usando un marco de registro adecuado), que el almacenamiento en búfer al capturar en el diario no es lo que esperaba.
Cameron Kerr
20

Python 3: logging

En lugar de usar la print()función básica , loggingse puede usar el módulo más flexible para registrar la excepción. El loggingmódulo ofrece mucha funcionalidad adicional, por ejemplo, registrar mensajes en un archivo de registro dado, registrar mensajes con marcas de tiempo e información adicional sobre dónde ocurrió el registro. (Para obtener más información, consulte la documentación oficial ).

El registro de una excepción se puede hacer con la función de nivel de módulo de la siguiente logging.exception()manera:

import logging

try:
    1/0
except BaseException:
    logging.exception("An exception was thrown!")

Salida:

ERROR:root:An exception was thrown!
Traceback (most recent call last):
  File ".../Desktop/test.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero 

Notas:

  • la función logging.exception() solo debe llamarse desde un controlador de excepciones

  • el loggingmódulo no debe usarse dentro de un controlador de registro para evitar un RecursionError(gracias @PrakharPandey)


Niveles de registro alternativos

También es posible registrar la excepción con otro nivel de registro utilizando el argumento de palabra clave de la siguiente exc_info=Truemanera:

logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)
winklerrr
fuente
1
No debe usarse dentro de un controlador de registro para evitar RecursionError
Prakhar Pandey
4

Se puede generar un error de línea con declaraciones de afirmación si eso es lo que desea hacer. Esto lo ayudará a escribir código reparable estáticamente y a verificar los errores temprano.

assert type(A) is type(""), "requires a string"
que nada
fuente
2

Uno tiene bastante control sobre qué información del rastreo se mostrará / registrará al detectar excepciones.

El código

with open("not_existing_file.txt", 'r') as text:
    pass

produciría el siguiente rastreo:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

Imprimir / registrar el rastreo completo

Como otros ya mencionaron, puede atrapar todo el rastreo utilizando el módulo de rastreo:

import traceback
try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    traceback.print_exc()

Esto producirá el siguiente resultado:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

Puede lograr lo mismo utilizando el registro:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    logger.error(exception, exc_info=True)

Salida:

__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
  File "exception_checks.py", line 27, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

Nombre / mensaje de error de impresión / registro solamente

Es posible que no esté interesado en todo el rastreo, pero solo en la información más importante, como el nombre de excepción y el mensaje de excepción, use:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    print("Exception: {}".format(type(exception).__name__))
    print("Exception message: {}".format(exception))

Salida:

Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'
GinTonic
fuente