__exit__()中的exc_值参数(上下文管理器)是字符串,而不是异常(Python 2.6)
我试图与上下文管理器混在一起,但在使用Python 2.6运行代码时,我有点吃惊。实际上,__exit__()中的exc_值参数(上下文管理器)是字符串,而不是异常(Python 2.6),python,exception,python-2.6,contextmanager,Python,Exception,Python 2.6,Contextmanager,我试图与上下文管理器混在一起,但在使用Python 2.6运行代码时,我有点吃惊。实际上,exc_value参数似乎是一个字符串,而不是一个异常 有一段代码可以说明这个问题: import sys class contextmanager(object): def __enter__(self): pass def __exit__(self, type_, value, traceback): assert (type_ is None)
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
#很好
回溯(最近一次呼叫最后一次):
文件“test_conman.py”,第17行,在
__名字_
名称错误:未定义名称“\uuuu name”
使用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
sys.version\u info(主要=3,次要=2,次要=3,发布级别=final',序列=0)
#好
回溯(最近一次呼叫最后一次):
文件“test_conman.py”,第17行,在
__名字_
名称错误:未定义名称“\uuuu name”
使用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
(2,6,7,‘最终’,0)
#坏的
回溯(最近一次呼叫最后一次):
文件“test_conman.py”,第17行,在
__名字_
名称错误:未定义名称“\uuuu name”
我的理解是,exc_value
应该始终是一个例外。
我做错什么了吗?
我有什么误解吗?
这是一个已知的问题吗
参考资料
不幸的是,除了处理2.6中没有异常实例,只有字符串值这一事实之外,没有其他真正的解决方法。不,您没有做错任何事情;2.6中的实现就是这样一种边缘情况,传入的值可以是字符串,而不是异常实例。我找到了答案,但当时我没有解决