If you have a running program in Python and press Ctrl+C, you’ll get a traceback like this:
$ scout java foo
^CTraceback (most recent call last):
File "/usr/bin/scout", line 11, in
ret = scout.ScoutCore.run()
File "/usr/lib64/python2.6/site-packages/scout/__init__.py", line 945, in run
result = module.ScoutModule().main(clp.module_args)
File "/usr/lib64/python2.6/site-packages/scout/__init__.py", line 873, in main
return self.do_query(args.query, repos, args.inversesearch)
File "/usr/lib64/python2.6/site-packages/scout/__init__.py", line 890, in do_query
result.add_rows(self._query(repo, query, inversesearch))
File "/usr/lib64/python2.6/site-packages/scout/__init__.py", line 896, in _query
r = db.query(self._sql, '%%%s%%' % term)
File "/usr/lib64/python2.6/site-packages/scout/__init__.py", line 485, in query
if len(row) == 1: #(2)
KeyboardInterrupt
It is useful suppress it, because user knows he breaks the program and this output should be considered as a bug. Possible solution is wrap a main function by one big try: except KeyboardInterrupt:
try:
main() # the main function
except KeyboardInterrupt:
pass # KeyboardInterrupt supressed
But it makes a new level of indentation which should be uncomfortable – especially in Python. Or when you have multiple entry-points, or just don’t well structured program (which is common when you write your private helper script :)), you maybe prefer another solution.
Python has a sys.excepthook, which is called for traceback printing, so we could define our own and suppress unnecessary output here. And it would be nice suppress only one exception and handle other ones using existing function. And this function make it:
def suppress_keyboard_interrupt_message():
old_excepthook = sys.excepthook
def new_hook(type, value, traceback):
if type != exceptions.KeyboardInterrupt:
old_excepthook(type, value, traceback)
else:
pass
sys.excepthook = new_hook
Function suppress_keyboard_interrupt_message (it is really nice name, don’t it ;-)) stores an existing hook and register an inner function new_hook as a new one. Advantage is that old_excepthook exists only in a scope of this function, so you don’t need use global variables for it.
Update: typos fixed