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