try print handling exceptions example error custom catch and all python error-handling user-experience

print - try and catch exception python



Ocultar rastreo a menos que se establezca un indicador de depuraciĆ³n (2)

El camino más corto es usar el módulo sys y usar este comando:

sys.tracebacklimit = 0

Usa tu bandera para determinar el comportamiento.

Ejemplo:

>>> import sys >>> sys.tracebacklimit=0 >>> int(''a'') ValueError: invalid literal for int() with base 10: ''a''

La forma más agradable es utilizar y excepción gancho :

def exception_handler(exception_type, exception, traceback): # All your trace are belong to us! # your format print "%s: %s" % (exception_type.__name__, exception) sys.excepthook = exception_handler

Editar:

Si aún necesita la opción de volver al gancho original:

def exception_handler(exception_type, exception, traceback, debug_hook=sys.excepthook): if _your_debug_flag_here: debug_hook(exception_type, exception, traceback) else: print "%s: %s" % (exception_type.__name__, exception)

Ahora puede pasar un enlace de depuración al controlador, pero lo más probable es que quiera utilizar siempre el que se originó en sys.excepthook (así que no pase nada en debug_hook ). Python une los argumentos predeterminados una vez en el tiempo de definición (error común ...) que hace que esto siempre funcione con el mismo controlador original, antes de ser reemplazado.

¿Cuál es la manera idiomática de python de ocultar los errores de rastreo a menos que se configure un indicador verboso o de depuración?

Código de ejemplo:

their_md5 = ''c38f03d2b7160f891fc36ec776ca4685'' my_md5 = ''c64e53bbb108a1c65e31eb4d1bb8e3b7'' if their_md5 != my_md5: raise ValueError(''md5 sum does not match!'')

Salida existente ahora, pero solo deseada cuando se llama con foo.py --debug :

Traceback (most recent call last): File "b:/code/apt/apt.py", line 1647, in <module> __main__.__dict__[command] (packages) File "b:/code/apt/apt.py", line 399, in md5 raise ValueError(''md5 sum does not match!'') ValueError: md5 sum does not match!

Salida normal deseada:

ValueError: md5 sum does not match!

Aquí hay un script de prueba: https://gist.github.com/maphew/e3a75c147cca98019cd8


try: pass # Your code here except Exception as e: if debug: raise # re-raise the exception # traceback gets printed else: print("{}: {}".format(type(e).__name__, e))