为什么 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 returns 类型、值和回溯。上下文管理器的 __exit__ 方法具有与参数相同的三样东西。类型不是多余的吗?它可以等于 type(value) 以外的值吗?

Python 曾在 1.x 天前允许字符串对象作为例外。与 Exception 个实例不同,字符串没有参数。

字符串异常在 1.5 中已弃用,并在 2.02.6 中删除。从那时起,我想这只是向后兼容性。这还不足以要求进行重大更改。

历史原因。

早在 1.x 的日子里,这些信息并没有全部捆绑在一个对象中。异常类型是 string(!) 而不是 class,值是某个任意对象,并且回溯没有附加到这些对象中的任何一个。所有 type, value, traceback API 都是围绕此设计构建的,其中这些对象必须单独传递:

MyException = "MyException"

raise MyException, 3

有时在 1.x 行(I think 1.2), they added class-based exceptions, and some time in the 2.x line (I think 2.6, since the 2.5 branch 代码路径似乎只发出警告),字符串异常被删除,但旧的函数签名仍然存在。