diff --git a/src/pluggy/callers.py b/src/pluggy/callers.py index d2977a1b..d3a5c4e6 100644 --- a/src/pluggy/callers.py +++ b/src/pluggy/callers.py @@ -109,6 +109,7 @@ def _multicall(hook_impls, caller_kwargs, firstresult=False): next(gen) # first yield teardowns.append(gen) except StopIteration: + gen.close() _raise_wrapfail(gen, "did not yield") else: res = hook_impl.function(*args) @@ -127,9 +128,17 @@ def _multicall(hook_impls, caller_kwargs, firstresult=False): # run all wrapper post-yield blocks for gen in reversed(teardowns): try: - gen.send(outcome) - _raise_wrapfail(gen, "has second yield") - except StopIteration: - pass + try: + gen.send(outcome) + _raise_wrapfail(gen, "has second yield") + except StopIteration: + pass + finally: + # Exception is risen only if generator + # suppresses GeneratorExit exception and yield + # so _raise_wrapfail above is necessary + gen.close() + except BaseException: + outcome = _Result(None, sys.exc_info()) return outcome.get_result()