17

カスタム カーソル クラスのブロック内から__exit__、より具体的な例外をスローできるように、例外をキャッチしたいと考えています。これを行う適切な方法は何ですか?

class Cursor:
    def __enter__(self):
        ...

    def __exit__(self, ex_type, ex_val, tb):
        if ex_type == VagueThirdPartyError:
            # get new more specific error based on error code in ex_val and
            # return that one in its place.
            return False # ?
        else:
            return False

ブロック内で特定の例外を発生させるの__exit__はハックのように思えますが、考えすぎかもしれません。

4

1 に答える 1

27

適切な手順は、__exit__ハンドラー内で新しい例外を発生させることです。

ただし、渡された例外を発生させるべきではありません。コンテキスト マネージャーの連鎖を許可するには、その場合、ハンドラーから falsey 値を返す必要があります。ただし、独自の例外を発生させることはまったく問題ありません。

is渡された例外のタイプを確認するには、ID テストを使用することをお勧めします。

def __exit__(self, ex_type, ex_val, tb):
    if ex_type is VagueThirdPartyError:
        if ex_val.args[0] == 'foobar':
            raise SpecificException('Foobarred!')

        # Not raising a new exception, but surpressing the current one:
        if ex_val.args[0] == 'eggs-and-ham':
            # ignore this exception
            return True

        if ex_val.args[0] == 'baz':
            # re-raise this exception
            return False

    # No else required, the function exits and `None` is  returned

issubclass(ex_type, VagueThirdPartyError)特定の例外のサブクラスを許可するために使用することもできます。

于 2013-03-11T16:50:47.053 に答える