except* 在不可散列的异常上失败 - 记录的行为还是错误?

J E*_*E K 5 python exception python-3.x python-3.11

考虑以下代码块:

class MyException(Exception):
    __hash__ = None

try:
    raise ExceptionGroup("Foo", [
        MyException("Bar")
    ])
except* Exception:
    pass
Run Code Online (Sandbox Code Playgroud)

应该except*捕获任意数量的任何类型的异常,并将其作为一个抛出ExceptionGroup(或者如果单独抛出,则捕获任何类型的单个异常)。相反,TypeError在处理我们的过程中发生了未处理的情况ExceptionGroup,据称是在我们模块的“第-1行”:

  + Exception Group Traceback (most recent call last):
  |   File "C:\Users\Josep\AppData\Roaming\JetBrains\PyCharmCE2022.2\scratches\scratch_62.py", line 6, in <module>
  |     raise ExceptionGroup("Foo", [
  | ExceptionGroup: Foo (1 sub-exception)
  +-+---------------- 1 ----------------
    | MyException: Bar
    +------------------------------------

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Josep\AppData\Roaming\JetBrains\PyCharmCE2022.2\scratches\scratch_62.py", line -1, in <module>
TypeError: unhashable type: 'MyException'
Run Code Online (Sandbox Code Playgroud)

except* Exception(如果我们用更具体的东西替换,比如except* ValueErrorexcept* MyException,也会发生同样的事情。如果我们尝试只提高一个单数MyException并用 正常捕获它except MyException,那就可以了。)

普通except子句不关心异常是否可散列。我找不到except*PEP-654 或 Python 3.11 发行说明中记录的这个怪癖。这是预期的行为,还是只是我正在使用的 Python 实现中的一个错误?

(对于那些想要重现此行为的人,我在 Windows 上使用 Python 3.11.0,64 位。)

Iri*_*iel 1

这是在https://github.com/python/cpython/issues/99181上报告的,我们有一个 PR 来修复它。应在 3.11.1 中修复。