我希望使用 python 函式來引發 a KeyError,以防我的腳本的用戶輸入了錯誤的值。
發生這種情況時,我想提高 a ValueError,而不是 a KeyError。我試圖抓住KeyError,然后ValueError 改為提高 a 。然后我得到兩個。
例如:
def func(my_dict):
return my_dict["my_key"]
a = {}
try:
func(a)
except KeyError as e:
raise ValueError("Replaced exception")
結果是:
$ python3 except.py
Traceback (most recent call last):
File "except.py", line 7, in <module>
func(a)
File "except.py", line 2, in func
return my_dict["my_key"]
KeyError: 'my_key'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "except.py", line 9, in <module>
raise ValueError("Replaced exception")
ValueError: Replaced exception
我不關心KeyError它本身,我只想告訴用戶關于ValueError.
我怎樣才能抓住KeyError,但丟棄它?這是不好的做法嗎?我應該如何組織這個呢?
uj5u.com熱心網友回復:
這里描述的一種方法是raise ... from None
def func(my_dict):
return my_dict["my_key"]
a = {}
try:
func(a)
except KeyError as e:
raise ValueError("Replaced exception") from None
但我仍然不確定這是否是一個好主意。
uj5u.com熱心網友回復:
您偶然發現的是例外原因和它的背景關系之間的區別。您可以做三件略有不同的事情,每件事情都有不同的語意:
版本 1:
try:
raise KeyError()
except KeyError as ex:
raise ValueError()
這將顯示由行分隔的兩個參考
在處理上述例外的程序中,又出現了一個例外:
這就是說:有一個例外,而在 catch 塊中還有另一個(不相關的,通常是意外的)例外。這不是你想要的。
版本 2:
try:
raise KeyError()
except KeyError as ex:
raise ValueError() from None
這將只顯示 ValueError 的回溯。如果您真的確定永遠不必除錯 KeyError ,這可能就是您想要的。否則,請繼續閱讀。
版本 3
try:
raise KeyError()
except KeyError as ex:
raise ValueError() from ex
同樣,這將顯示兩個回溯,這次由行分隔
上述例外是以下例外的直接原因:
注意到與版本 1 的區別了嗎?從語意上講:在這個抽象級別上,這是一個 ValueError。但是如果你需要除錯它,這里也是原始 KeyError 的回溯。很整潔,你不覺得嗎?
uj5u.com熱心網友回復:
您沒有 try/except 塊來管理 ValueError。因此,您看到的是一個堆疊跟蹤,它告訴您 ValueError 的來源。
考慮一下:
def func(my_dict):
return my_dict["my_key"]
a = {}
try:
try:
func(a)
except KeyError as e:
raise ValueError("Replaced exception")
except ValueError as e:
print(e)
輸出:
Replaced exception
IE,
No stack trace because you've caught the ValueError
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/512947.html
標籤:Python例外
上一篇:如何僅使用`handleAsync`來處理非異步例外?
下一篇:C 例外代碼與類
