如何理解python的contextlib模块中的解释

时间:2019-06-17 10:29:46

标签: python python-3.x

在类_GeneratorContextManager中,当__exit__中的异常被抛出到生成器中时,为什么会这样说:

  

禁止StopIteration ,除非,这与传递给throw()的异常相同。这样可以防止在“ with”语句内引发的StopIteration。

        if value is None:
            # Need to force instantiation so we can reliably
            # tell if we get the same exception back
            value = type()

        try:
             self.gen.throw(type, value, traceback)

        except StopIteration as exc:
            # Suppress StopIteration *unless* it's the same exception that
            # was passed to throw().  This prevents a StopIteration
            # raised inside the "with" statement from being suppressed.
            return exc is not value
        except RuntimeError as exc:
            # Don't re-raise the passed in exception. (issue27122)
            if exc is value:
                return False
            # Likewise, avoid suppressing if a StopIteration exception
            # was passed to throw() and later wrapped into a RuntimeError
            # (see PEP 479).
            if type is StopIteration and exc.__cause__ is value:
                return False
            raise
        except:
            # only re-raise if it's *not* the exception that was
            # passed to throw(), because __exit__() must not raise
            # an exception unless __exit__() itself failed.  But throw()
            # has to raise the exception to signal propagation, so this
            # fixes the impedance mismatch between the throw() protocol
            # and the __exit__() protocol.
            #
            # This cannot use 'except BaseException as exc' (as in the
            # async implementation) to maintain compatibility with
            # Python 2, where old-style class exceptions are not caught
            # by 'except BaseException'.

            if sys.exc_info()[1] is value:
                return False
            raise
        raise RuntimeError("generator didn't stop after throw()")

0 个答案:

没有答案