Python全局异常处理

时间:2011-07-06 14:28:18

标签: python exception exception-handling

所以我想全局捕捉KeyboardInterrupt,并妥善处理它。我不想把我的整个脚本包含在一个巨大的try / except语句中,因为这听起来很糟糕。有没有办法做到这一点?

5 个答案:

答案 0 :(得分:105)

如果您确实不想使用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

答案 1 :(得分:23)

如果这是一个在命令行上执行的脚本,您可以将运行时逻辑封装在main()中,在if __name__ == '__main__'中调用它并将其包装。

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print 'Killed by user'
        sys.exit(0)

答案 2 :(得分:10)

你也可以像这样使用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

N.B:不要将信号与线程混合使用。

答案 3 :(得分:8)

您的脚本是否具有您启动它的功能?

main()

然后就这样做:

try:
    main()
except:
    ...

如果您没有main但只是一个逐行运行的巨大脚本,那么您应该将其放在main中。

答案 4 :(得分:4)

除了将整个脚本包含在main()函数中并使用try..except块包围它之外,没有其他办法可以做到这一点 - 这几乎是相同的:

def main():
    # Your script goes here
    pass

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        # cleanup code here
        pass