[英]difference between <try> and <except> before the function & in the function
當我在 function 之前使用try時,它會引發錯誤。 但如果我在function 中使用它就可以了。 為什么?(這些代碼的評估順序是什么?)。 任何幫助表示贊賞。
try:
def chiz(dict, key):
return dict[key]
except:
print("somethig went wrong")
user_01 = {
"name": "armin",
"age": 20.51
}
chiz(user_01, "weight")
>>>Traceback (most recent call last):
File "C:\Users\user\PycharmProjects\pythonWhile\test.py", line 11, in <module>
chiz(user_01, "weight")
File "C:\Users\user\PycharmProjects\pythonWhile\test.py", line 3, in chiz
return dict[key]
KeyError: 'weight'
def chiz(dict, key):
try:
return dict[key]
except :
print("somethig went wrong")
user_01 = {
"name": "armin",
"age": 20.51
}
chiz(user_01, "weight")
當調用 function 時,不會評估第一個示例中的try
,僅在首先定義 function 時才評估,此時不會引發異常。
直到您實際使用 arguments 調用 function 時,在給定字典中不存在鍵的情況下,才會實際引發異常並且不會評估 try/except 子句。
你的第二個例子是做你想做的事情的正確方法:
In [4]: def chiz(dict, key):
...: try:
...: return dict[key]
...: except:
...: print("Something went wrong")
...:
In [5]: chiz(user_01, "weight")
Something went wrong
話雖如此,請重新考慮那個裸露的 except 子句。 這相當於說except BaseException:
這可能不是您想要的,並且違反PEP8 建議。 在這種情況下,您可能應該使用except KeyError:
,或者,最多可以使用except Exception:
。
捕獲異常時,盡可能提及特定的異常,而不是使用裸的
except:
子句。 一個簡單的except:
子句將捕獲SystemExit
和KeyboardInterrupt
異常,使使用 Control-C 中斷程序變得更加困難,並且可以掩蓋其他問題。 如果要捕獲所有表明程序錯誤的異常,請使用except Exception:
(bare except 等效於except BaseException:
)。 一個好的經驗法則是將裸“除外”子句的使用限制在兩種情況下:
- 如果異常處理程序將打印或記錄回溯; 至少用戶會意識到發生了錯誤。
- 如果代碼需要做一些清理工作,然后讓異常通過 raise 向上傳播。 嘗試...終於可以成為處理這種情況的更好方法。
從PEP463 :
任何你捕捉到你不希望捕捉到的異常的情況都是不必要的錯誤磁鐵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.