From fbfb60ced3ba7b52ca1d7c3885f7cffdf45d562b Mon Sep 17 00:00:00 2001 From: Maxim Nikulin Date: Tue, 21 Apr 2020 21:53:16 +0700 Subject: [PATCH] Handle exceptions in hookwrapper post stage (#244) --- src/pluggy/_callers.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/pluggy/_callers.py b/src/pluggy/_callers.py index fbcade23..4b454d4f 100644 --- a/src/pluggy/_callers.py +++ b/src/pluggy/_callers.py @@ -72,8 +72,18 @@ def _multicall( for gen in reversed(teardowns): try: gen.send(outcome) + # Following is unreachable for a well behaved hook wrapper. + # Try to force finalizers otherwise postponed till GC action. + # Note: close() may raise if generator handles GeneratorExit. + gen.close() _raise_wrapfail(gen, "has second yield") except StopIteration: + # Regular code path: exited after single yield, close() is unnecessary. pass + except BaseException: + # Any other exception: instead of yield, in response to close, extra yield. + cur_excinfo = sys.exc_info() + if cur_excinfo[0] is not None: # silence type checker + outcome._excinfo = cur_excinfo return outcome.get_result()