Python 捕获全局的 KeyboardInterrupt 异常

当然,像下面这种情况。

你要是把所有代码像下面那样都放到 try, except 的情况,就当我什么也没说。

import time


def main():
    print('before ...')
    time.sleep(10)
    print('after ...')


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print('\nKeyboardInterrupt ...')
    print('the end')
root@master ~/w/python3_learning# python3 test.py 
before ...
^C
KeyboardInterrupt ...
the end

一般情况下,程序运行过程当中要执行的代码量会比较大,一般用户执行 Ctrl + C 程序就报错 KeyboardInterrupt 停止了。

import time


def main():
    print('before ...')
    time.sleep(10)
    print('after ...')


if __name__ == '__main__':
    main()
    print('the end')
root@master ~/w/python3_learning# python3 test.py 
before ...
^CTraceback (most recent call last):
  File "test.py", line 11, in <module>
    main()
  File "test.py", line 6, in main
    time.sleep(10)
KeyboardInterrupt

但是有时候,我们希望用户在 Ctrl + C 之后再继续执行一些清理操作。

import sys
import time


def suppress_keyboard_interrupt_message():
    old_excepthook = sys.excepthook

    def new_hook(exctype, value, traceback):
        if exctype != KeyboardInterrupt:
            old_excepthook(exctype, value, traceback)
        else:
            print('\nKeyboardInterrupt ...')
            print('do something after Interrupt ...')
    sys.excepthook = new_hook


def main():
    print('before ...')
    time.sleep(10)
    print('after ...')


if __name__ == '__main__':
    suppress_keyboard_interrupt_message()
    main()
    print('the end')
root@master ~/w/python3_learning# python3 test.py 
before ...
^C
KeyboardInterrupt ...
do something after Interrupt ...

由于 suppress_keyboard_interrupt_message 函数中的 new_hook 是自定义的,所以你也不一定局限于只处理某种异常,甚至对所有异常做统一处理也是可以的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值