Python全局异常处理

70 投票
5 回答
56139 浏览
提问于 2025-04-16 20:57

我想要全局捕捉到 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

相关文档:

撰写回答