Add try/finally block to yield in reporter.py #8508
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
background
In
reporter.py
, a logging context stack is maintained as its internal thread-local variable named_thread_local.reporters
.In
Reporter.scope()
function, a Reporter object is pushed and popped to the stack in__enter__()
and__exit__()
function.the bug
If the
yield
omits an exception, the__exit__()
is not called and the stack becomes an inconsistent state. In most use cases, such runtime error causes program termination thus the bug does not matter a lot.However, in rare cases, such as #8384, it matters.
The bug forces the whole
pytest
process to terminate during a test.fix
This PR fixes the problem by adding
try/finally
block around theyield
sentence so the pop operation is done correctly and the stack is kept consistent.Appendix:
The error message from #8384 test looks like this: