重新分配从蟒__exit__块内的例外(Re-assign exception from withi

2019-08-17 12:01发布

从内__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__块似乎是一个黑客,但也许我思前想。

Answer 1:

正确的方法是提高内部的新的异常__exit__处理。

应该提高的是在虽然通过除外; 允许上下文管理链,在这种情况下,你应该只从处理程序返回一个falsey值。 提高自己的异常不过是完全正常的。

请注意,这是更好地利用身份测试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)以允许特定异常的子类。



文章来源: Re-assign exception from within a python __exit__ block