__exit __()(上下文管理器)中的exc_value参数是字符串而不是Exception(Python 2.6)

时间:2015-05-03 09:07:03

标签: 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) == (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应该始终是一个例外。 有什么我做错了吗? 有什么我误解了吗? 这是一个已知的问题吗?

参考

0 个答案:

没有答案