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
Both comments and pings are currently closed.