Respuestas:
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)
str( KeyError('bad'))
=> 'bad'
- no dice el tipo de excepción
print(repr(e))
; la Exception.__str__
implementación base solo devuelve el mensaje de excepción, no el tipo. O utilice el traceback
módulo, que tiene métodos para imprimir la excepción actual, formateada o el rastreo completo.
El traceback
mó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
error_message = traceback.format_exc()
except Exception as ex:
...
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.
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
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
(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.stdout
por 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 sys
para que esto funcione). De esta manera, el error se imprime en STDERR
lugar 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 traceback
módulo como en la respuesta de Cat Plus Plus, y tal vez esa sea la mejor manera, pero pensé en lanzar esto.
logging
En lugar de usar la print()
función básica , logging
se puede usar el módulo más flexible para registrar la excepción. El logging
mó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 logging
módulo no debe usarse dentro de un controlador de registro para evitar un RecursionError
(gracias @PrakharPandey)
También es posible registrar la excepción con otro nivel de registro utilizando el argumento de palabra clave de la siguiente exc_info=True
manera:
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)
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'
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'
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'