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__

但是,您不应该引发传入的异常;为了允许上下文管理器链接,在这种情况下,您应该只从处理程序返回一个错误的值。然而,提出你自己的例外是非常好的。

注意,最好使用身份测试is来验证传入异常的类型:

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 回答