簡體   English   中英

之間的區別<try>和<except>在 function 和 function 之前</except></try>

[英]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:子句將捕獲SystemExitKeyboardInterrupt異常,使使用 Control-C 中斷程序變得更加困難,並且可以掩蓋其他問題。 如果要捕獲所有表明程序錯誤的異常,請使用except Exception: (bare except 等效於except BaseException: )。 一個好的經驗法則是將裸“除外”子句的使用限制在兩種情況下:

  • 如果異常處理程序將打印或記錄回溯; 至少用戶會意識到發生了錯誤。
  • 如果代碼需要做一些清理工作,然后讓異常通過 raise 向上傳播。 嘗試...終於可以成為處理這種情況的更好方法。

PEP463

任何你捕捉到你不希望捕捉到的異常的情況都是不必要的錯誤磁鐵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM