4

我觉得 sys.excepthook 是如何工作的很令人费解。鉴于以下情况,我找不到继续前进的方法,以防异常被钩子捕获。简而言之,我从未达到 print 声明,但我确信理论上可以继续。返回 True 或 False 也没有帮助?

import sys
from shutil import copy
from subprocess import Popen


def my_except_hook(etype, value, tb):
    print("got an exception of type", etype)


if __name__ == '__main__':
    sys.excepthook = my_except_hook
    copy('sdflsdk')
    print("here")
    Popen('sdflkjdklsdj')

那么输出是:

('got an exception of type', <type 'exceptions.TypeError'>)
4

2 回答 2

3

不,理论上不可能继续下去。sys.excepthook仅在整个堆栈展开且未找到异常处理程序时调用,就在程序退出之前。除了退出程序之外,没有什么可以继续的。您确定您不是在寻找try...except语句吗?

于 2012-07-06T15:57:32.913 回答
3

sys.excepthook 并不打算强制转换为 VB 风格的“On Error Resume Next”。可能有办法做到这一点,但你真的应该包装自己的代码来做到这一点。system.excepthook 是为诸如 python 交互式解释器之类的东西而设计的,以便它们打印异常并将您返回到交互式 shell。要执行您寻求的恢复行为,您应该考虑执行以下操作:

import sys
from shutil import copy
from subprocess import Popen

if __name__ == '__main__':
    try:
        copy('sdflsdk')
    except:
        pass
    print("here")
    try:
        Popen('sdflkjdklsdj')
    except:
        pass
于 2012-07-06T16:03:58.707 回答