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:\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!
Desired normal output:
ValueError: md5 sum does not match!
Here's a test script: https://gist.github.com/maphew/e3a75c147cca98019cd8
If there is no variable defined with that name you will get a NameError exception. To fix the problem, in Python 2, you can use raw_input() . This returns the string entered by the user and does not attempt to evaluate it. Note that if you were using Python 3, input() behaves the same as raw_input() does in Python 2.
If type(value) is SyntaxError and value has the appropriate format, it prints the line where the syntax error occurred with a caret indicating the approximate position of the error. traceback. print_exc(limit = None, file = None, chain = True) : This is a shorthand for print_exception(*sys.
Some of the common traceback errors are:IndexError. KeyError. TypeError. valueError.
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With