我试图搞乱上下文管理器,并且在使用Python 2.6运行我的代码时感到有些惊讶。实际上,exc_value
参数似乎是一个字符串而不是异常。
一些代码可以解决这个问题:
import sys
class contextmanager(object):
def __enter__(self):
pass
def __exit__(self, type_, value, traceback):
assert (type_ is None) == (value is None)
if value is not None:
print(type(value))
if __name__ == '__main__':
print(sys.version_info)
with contextmanager():
__name_ # should trigger name exception
使用Python 2.7:
<type 'exceptions.NameError'> # GOOD
Traceback (most recent call last):
File "test_conman.py", line 17, in <module>
__name_
NameError: name '__name_' is not defined
使用Python 3.2:
sys.version_info(major=3, minor=2, micro=3, releaselevel='final', serial=0)
<class 'NameError'> # GOOD
Traceback (most recent call last):
File "test_conman.py", line 17, in <module>
__name_
NameError: name '__name_' is not defined
使用Python 2.6:
(2, 6, 7, 'final', 0)
<type 'str'> # BAD
Traceback (most recent call last):
File "test_conman.py", line 17, in <module>
__name_
NameError: name '__name_' is not defined
我的理解是exc_value
应该始终是一个例外。
有什么我做错了吗?
有什么我误解了吗?
这是一个已知的问题吗?
参考