为什么Python经常将异常类型和值(exc_info,__ exit__等)分开?

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分支代码路径似乎只会发出警告),字符串异常被删除,但旧的函数签名仍然存在。


python用于在1.x天内允许字符串对象作为异常。字符串没有参数,与Exception实例不同。

字符串异常在1.5中被弃用,并在2.02.6中删除。从那时起,我想这只是向后兼容。这还不足以让你做出突破性的改变。