try:
    something here
except:
    print('the whatever error occurred.')

¿Cómo puedo imprimir el error/excepción en mi except:bloque?

respuesta

Para Python 2.6 y posteriores y Python 3.x:

except Exception as e: print(e)

Para Python 2.5 y versiones anteriores, use:

except Exception,e: print str(e)

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

import traceback

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

Producción:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero

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 quiera 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.stdoutde forma predeterminada. 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 debe hacerlo import syspara que esto funcione). De esta manera, el error se imprime en STDERRlugar de STDOUT, lo que permite el análisis/redireccionamiento/etc de salida adecuado. 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 finalmente 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 tirar esto.

Pitón 3:logging

En lugar de utilizar la función básica , se puede utilizar el módulo print()más flexible para registrar la excepción. loggingEl loggingmódulo ofrece muchas funciones adicionales, por ejemplo, registrar mensajes en un archivo de registro determinado, registrar mensajes con marcas de tiempo e información adicional sobre dónde se produjo 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 logging.exception()siguiente manera:

import logging

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

Producción:

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 exc_info=Truesiguiente 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 muestra/registra cuando se detectan 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 capturar 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á la siguiente salida:

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)

Producción:

__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'

Imprimir/registrar nombre/mensaje de error solamente

Es posible que no esté interesado en todo el rastreo, sino solo en la información más importante, como el nombre de la 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))

Producción:

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

Ampliando la solución "excepto Excepción como e:" aquí hay una buena línea que incluye información adicional como el tipo de error y dónde ocurrió.


try:
    1/0
except Exception as e:
    print(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")

Producción:

ZeroDivisionError at line 48 of /Users/.../script.py: division by zero

El aumento de error de una línea se puede hacer con afirmaciones si eso es lo que quiere hacer. Esto lo ayudará a escribir código estáticamente corregible y verificar errores temprano.

assert type(A) is type(""), "requires a string"

#Prueba esto

try:

    print("Hare Krishna!")

except Exception as er:

    print(er)
    

Recomendaría usar una instrucción try-except. Además, en lugar de usar una declaración de impresión, una excepción de registro registra un mensaje con el nivel ERROR en el registrador, lo que creo que es más efectivo que una salida de impresión. Este método solo debe llamarse desde un controlador de excepciones, como está aquí:

import logging

try:
    *code goes here*
except BaseException:
    logging.exception("*Error goes here*")

Hay buena documentación en esta página de python si desea obtener más información sobre el registro y la depuración.