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