Python全局exception处理

所以我想全局捕获KeyboardInterrupt ,并且很好地处理它。 我不想把我的整个脚本放在一个巨大的尝试/除了声明,因为这听起来很粗糙。 有没有办法做到这一点?

如果这是在命令行上执行的脚本,则可以将运行时逻辑封装在main() ,并在if __name__ == '__main__'调用并包装它。

 if __name__ == '__main__': try: main() except KeyboardInterrupt: print 'Killed by user' sys.exit(0) 

你可以改变sys.excepthook如果你真的不想使用try/except

 import sys def my_except_hook(exctype, value, traceback): if exctype == KeyboardInterrupt: print "Handler code goes here" else: sys.__excepthook__(exctype, value, traceback) sys.excepthook = my_except_hook 

你的脚本有一个你打电话来启动它的function吗?

 main() 

那么就做:

 try: main() except: ... 

如果你没有一个main但只是一个巨大的脚本逐行运行,那么你应该把它放在一个main

你也可以使用这样的信号 :

 import signal, time def handler(signum, frame): print 'I just clicked on CTRL-C ' signal.signal(signal.SIGINT, handler) print "waiting for 10 s" time.sleep(10) 

输出:

 waiting for 10 s ^CI just clicked on CTRL-C 

注意:不要将信号与线程混合使用。

除了将你的整个脚本封装在一个main()函数中并用try..except块包围它之外,没有别的办法可以做到这一点 – 这几乎是一样的:

 def main(): # Your script goes here pass if __name__ == "__main__": try: main() except KeyboardInterrupt: # cleanup code here pass