考慮以下代碼塊:
class MyException(Exception):
__hash__ = None
try:
raise ExceptionGroup("Foo", [
MyException("Bar")
])
except* Exception:
pass
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'
(如果我們用except* Exception更具體的東西替換 ,比如except* ValueErroror except* MyException,同樣的事情也會發生。如果我們嘗試只提高一個單曲MyException并用 正常捕捉它except MyException,那很好。)
普通except子句不關心例外是否可散列。我找不到except*PEP-654 或 Python 3.11 發行說明中記錄的這種怪癖。這是預期的行為,還是只是我正在使用的 Python 實作中的一個錯誤?
(對于那些想要重現此行為的人,我在 Windows 上使用 Python 3.11.0,64 位。)
uj5u.com熱心網友回復:
這是在https://github.com/python/cpython/issues/99181報告的,我們有一個 PR 來修復它。應該在 3.11.1 中修復。
uj5u.com熱心網友回復:
我不會真的稱它為錯誤。破壞承諾Exception類(實作__hash__方法)是程式員的錯;因此,程式員負責確保在執行此操作后事情按預期作業。畢竟,您會將以下代碼段稱為“錯誤”或“程式員錯誤”嗎?
class MyInt(int):
__hash__ = None
d = {}
d[MyInt(2)] = 2 # TypeError: unhashable type: 'MyInt'
你的例子并沒有太大的不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/529628.html
標籤:Pythonpython-3.x例外python-3.11
上一篇:如何禁用特定例外的警告?
