What is the idiomatic python way to hide traceback errors unless a verbose or debug flag is set?
Example code:
their_md5 = 'c38f03d2b7160f891fc36ec776ca4685' my_md5 = 'c64e53bbb108a1c65e31eb4d1bb8e3b7' if their_md5 != my_md5: raise ValueError('md5 sum does not match!')
Existing output now, but only desired when called with foo.py --debug
:
Traceback (most recent call last): File "b:codeaptapt.py", line 1647, in <module> __main__.__dict__[command] (packages) File "b:codeaptapt.py", line 399, in md5 raise ValueError('md5 sum does not match!') ValueError: md5 sum does not match!
Desired normal output:
ValueError: md5 sum does not match!
Here’s a test script: https://gist.github.com/maphew/e3a75c147cca98019cd8
Advertisement
Answer
The short way is using the sys
module and use this command:
sys.tracebacklimit = 0
Use your flag to determine the behaviour.
Example:
>>> import sys >>> sys.tracebacklimit=0 >>> int('a') ValueError: invalid literal for int() with base 10: 'a'
The nicer way is to use and exception hook:
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
Edit:
If you still need the option of falling back to the original hook:
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)
Now you can pass a debug hook to the handler, but you’ll most likely want to always use the one originated in sys.excepthook
(so pass nothing in debug_hook
). Python binds default arguments once in definition time (common pitfall…) which makes this always work with the same original handler, before replaced.