1

カスタムsys.excepthookを利用したいという状況があります。プログラムが例外をスローすると、sys.exceptフックが呼び出され、いくつかの処理が実行されます。

例:

import sys
def ehook(exctype, value, traceback):
    t = 'Keys'
    if exctype == AttributeError and value.args[0].split("'")[1] == t:
        print "t %s" % (t,)
    else:
        sys.__excepthook__(exctype, value, traceback)

sys.excepthook = ehook



class Keys():
    @staticmethod
    def x():
        print "this is Keys.x()"


if __name__ == "__main__":
    Keys.x()
    Keys.noexist()
    print "I want to continue here and beyond..."

プログラムを終了させないように、excepthookでアクティブな例外をキャンセルする方法はありますか?

4

1 に答える 1

4

いいえ。sys.excepthookが呼び出されるまでに、例外は最上位レベルで既にキャッチされてsys.excepthookおらず、プログラムは作業後に終了します。(ドキュメンテーションを参照してください。) 一般に、例外は Python では再開できません: キャッチした場所で例外を処理し、発生した場所から続行することはできません。少しの議論については、このスレッドを参照してください。

編集:あなたのコメントに基づいて、プログラム全体ですべての例外をキャッチしようとしているようには思えません。特定のオブジェクトの未定義の属性ルックアップをキャッチしたいだけです。その場合は__getattr__、クラスに a を定義するだけです。

于 2013-02-21T01:50:07.377 に答える