[issue26528] NameError for built in function open when re-raising stored exception from yielded function
reidfaiv
report at bugs.python.org
Thu Mar 10 07:09:57 EST 2016
New submission from reidfaiv:
Builtin open() gets NameError) in context manager __exit__ in case:
* context manager yielding records
* we return another generator when consuming these and
* second generator raises, catches, stores and re-raises an excption
Reduced down code looks like this:
---------------------------------------
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# context manager "query" (open in init, yield rows and close on exit)
class _query():
def __init__(self, **kwargs):
pass
def __enter__(self):
return [1, 2, 3]
def __exit__(self, type_, value, tb):
print('__exit__') # print() is also built-in, but works
f = open('test.log', 'wt') # <-- NameError: name 'open' is not defined
f.close()
# this works fine
def a():
try:
raise Exception('volatile exception')
except Exception as e:
raise e
# this does not work
def b():
try:
raise Exception('stored exception')
except Exception as e:
ee = e # <-- storing exception and then
raise ee # <-- re-raising stored exception triggers the issue
def event_gen(**kwargs):
with _query() as cursor:
for _ in cursor:
yield b # <--- does not work
# yield a # <--- works fine
def run(**kwargs):
g = event_gen(**kwargs)
r = next(g)
r()
# This also works
# for r in event_gen(**kwargs):
# r()
if __name__ == '__main__':
run()
---------------------------------------
>python.exe gen_err.py
Traceback (most recent call last):
File "gen_err.py", line 52, in <module>
run()
File "gen_err.py", line 46, in run
r()
File "gen_err.py", line 33, in b
raise ee # <-- re-raising stored exception triggers the issue
File "gen_err.py", line 30, in b
raise Exception('stored exception')
Exception: stored exception
__exit__
Exception ignored in: <generator object event_gen at 0x000001A31F7C4048>
Traceback (most recent call last):
File "gen_err.py", line 39, in event_gen
File "gen_err.py", line 15, in __exit__
NameError: name 'open' is not defined
This happens with Python 3.4+
Works with earlier versions as expected.
If exception re-raised immediately, works fine.
If outermost generator is consumed in for loop, works fine.
----------
components: Interpreter Core
files: gen_err.py
messages: 261497
nosy: reidfaiv
priority: normal
severity: normal
status: open
title: NameError for built in function open when re-raising stored exception from yielded function
type: behavior
versions: Python 3.4, Python 3.5
Added file: http://bugs.python.org/file42114/gen_err.py
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue26528>
_______________________________________
More information about the Python-bugs-list
mailing list