4

sys.excepthook がどのように機能するかは非常に不可解です。以下を考えると、例外がフックによってキャッチされた場合に続行する方法が見つかりません。要するに、印刷ステートメントに到達することはありませんが、理論的には続行できると確信しています。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 対話型インタープリターなどのために設計されているため、例外を出力して対話型シェルに戻ります。求めている再開動作を実行するには、次のようなことを検討する必要があります。

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 に答える