Why does Python often separate the exception type and value (exc_info, __exit__, etc)?
traceback.format_exception_only有参数(etype, value)。如果我有一个我想要格式化的异常e,在什么情况下我不想调用format_exception_only(type(e), e)?
sys.exc_info返回类型、值和回溯。上下文管理器的__exit__方法与参数具有相同的三个方面。该类型是否不冗余?它能等于除type(value)以外的其他东西吗?
历史原因。
回到1.x天,这些信息并不是全部打包在一个对象中。异常类型是字符串!!)这个值不是类,而是一些任意的对象,并且回溯没有附加到这些对象中的任何一个。所有type, value, tracebackAPI都是围绕这个设计构建的,这些对象必须单独传递:
1 2 3
| MyException ="MyException"
raise MyException, 3 |
有时在1.x行(我认为是1.2),他们添加了基于类的异常,有时在2.x行(我认为是2.6,因为2.5分支代码路径似乎只会发出警告),字符串异常被删除,但旧的函数签名仍然存在。
- "追溯没有附加到这些对象中的任何一个"是不是仍然如此?
- @Alexhall:在python 3中,回溯作为异常对象的__traceback__属性提供。
- 啊,没想到。python 2文档警告说,通过存储回溯创建的循环效率很低。这个新属性会影响python3的效率还是魔法?
- @Alexhall:按照PEP 3110的规定,当控件离开except块时,python 3会自动将del作为except目标来中断循环。
- 太棒了,谢谢!这很有趣。
python用于在1.x天内允许字符串对象作为异常。字符串没有参数,与Exception实例不同。
字符串异常在1.5中被弃用,并在2.02.6中删除。从那时起,我想这只是向后兼容。这还不足以让你做出突破性的改变。
- python 3应该是打破变化的时候了。
- @markransom:对于一些破坏性的改变,而不是"破坏一切"的改变。即使没有它,它也会破坏足够多的东西,导致一个非常缓慢的接受曲线。用于回溯访问的低级API很少被使用,主要由框架、调试程序、分析程序等的开发人员使用。如果打破它,将使刚刚起步的python 3在一段时间内没有这些可能非常重要的工具;如果没有一个该死的好理由,它可能不值得做。
- 2.0仍然有字符串异常。我认为只有在2.6中才完全删除了它们;2.5分支机构在raise实现中仍然有处理它们的能力,并有DeprecationWarning实现。