__exit__()中的exc_值参数(上下文管理器)是字符串,而不是异常(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)

我试图与上下文管理器混在一起,但在使用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
#很好
回溯(最近一次呼叫最后一次):
文件“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
应该始终是一个例外。 我做错什么了吗? 我有什么误解吗? 这是一个已知的问题吗

参考资料


这是Python 2.6中的一个bug,请参阅。它针对Python2.7a3进行了修复,但从未向后移植到2.6分支

换句话说,你没有做错什么,Python做了


不幸的是,除了处理2.6中没有异常实例,只有字符串值这一事实之外,没有其他真正的解决方法。

不,您没有做错任何事情;2.6中的实现就是这样一种边缘情况,传入的值可以是字符串,而不是异常实例。我找到了答案,但当时我没有解决