Python全局异常处理
我想要全局捕捉到 KeyboardInterrupt
,并且优雅地处理它。我不想把整个脚本都放在一个很大的 try/except 语句里。有没有什么办法可以做到这一点?
5 个回答
21
你也可以像这样使用 signal:
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
注意:不要把信号和线程混在一起使用。
25
如果这是一个在命令行上执行的脚本,你可以把你的运行逻辑放在一个叫 main()
的函数里,然后在 if __name__ == '__main__'
这个条件下调用它,并把这一切包裹起来。
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print 'Killed by user'
sys.exit(0)
155
如果你真的不想使用 try/except
这种方式,你可以改变 sys.excepthook
的设置。
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
相关文档: