異常
pYthon使用被稱為異常的特殊物件來管理程式執行期間發生的錯誤。每當發生讓python不知所錯的錯誤時,他都會建立一個異常物件。當你編寫了處理改異常的程式碼,該程式將繼續執行;如果你未對異常進行處理,程式停止,並顯示一個traceback,其中包含有關異常的報告。
異常是使用try-except程式碼塊處理的。try-except程式碼塊讓python執行指定的操作,同時告訴python發生異常時怎麼辦。
1.處理ZeroDivisionError異常
Python無法按照你的要求做時,就會建立這種物件。在這種情況下python會停止執行程式,並指出應發了那種異常。
2.使用 try-except程式碼塊
當我們認為可能發生錯誤時,可編寫一個try-except程式碼塊來處理可能引發的異常,讓你的python嘗試執行一些程式碼,並告訴它這些程式碼指定的異常,改怎麼辦?
try:
print(5/0)
except ZeroDivisionError:
print("you can't division by zero ...")
如果try-except程式碼後面還有其他程式碼,程式將接著執行,因為已經告訴了python如何處理這種問題。
3.使用異常避免搞崩潰
發生錯誤時,如果程式還有工作沒有完成,妥善的處理錯誤就尤為重要了。比如說,要求使用者輸入的程式中,如果程式能夠有效處理無效輸入,而不至於崩潰。
while True:
first_number = input("\nFrist_number:")
if first_number == "q":
break
second_number = input("\nsecond_nmuber:")
if second_number == "q":
break
answer = int(first_number)/int(second_number)
print(answer)
這樣的程式看起來貌似沒有什麼問題,但是如果使用者輸入的內容不是數字或者“q”是將會報錯,並且使得程式崩潰。
while True:
first_number = input("\nFrist_number:")
if first_number == "q":
break
second_number = input("\nsecond_nmuber:")
if second_number == "q":
break
try:
answer = int(first_number)/int(second_number)
except ZeroDivisionError:
print("哥們,別逗..")
except ValueError:
print("你是豬嗎?..")
else:
print(answer)
這樣實現了一次登入後的資料記錄。
重構
有時候我們有這樣的需求:程式碼能夠正常的執行,那可做進一步的修改——將程式碼劃分為一系列完成具體工作的函式。這樣的過程被稱為重構。
就1.2節的低嗎,我們來完成重構。
要重構以上程式,可將其大部分邏輯放到一個或多個函式中。以上程式碼重點是實現問候客戶,因此我們將其放到一個greet_user()的函式中:
import json
def greet_user():
filename = "username1.json"
"""問候使用者,並指定其名字"""
try:
with open(filename,"r",encoding=("utf-8")) as f_obj:
usernames = json.load(f_obj)
except FileNotFoundError:
usernames = input("請輸入您的名字?")
with open(filename,"w",encoding=("utf-8")) as f_obj:
json.dump(usernames,f_obj)
else:
print("歡迎%s登入系統..." %(usernames))
greet_user()
上述greet_user函式不僅僅是問候使用者,還有儲存了使用者名稱獲取,沒有儲存輸入的功能。
下面我們再來重構greet_函式,讓他不執行這麼多工。為此,我們首先將獲取儲存的使用者名稱的程式碼移植到另一個函式中。
import json
def get_stored_username():
'''如果儲存了使用者,就獲取它'''
filename = "username1.json"
try:
with open(filename,"r",encoding=("utf-8")) as f_obj:
usernames = json.load(f_obj)
except FileNotFoundError:
return None
else:
return usernames
def greet_user():
"""問候使用者並指出其名"""
usernames = get_stored_username()
if usernames:
print("歡迎%s登入系統..." % (usernames))
else:
usernames = input("請輸入您的名字?")
filename = "username1.json"
with open(filename,"w",encoding=("utf-8")) as f_obj:
json.dump(usernames,f_obj)
greet_user()
上述程式碼已經將儲存使用者的程式碼提取出來,透過返回值來確定是否需要使用者輸入姓名。此時呢,還有一個程式碼塊需要我們重構,就是:沒有儲存使用者名稱提示時輸入使用者名稱的程式碼?
#學習中遇到問題沒人解答?小編建立了一個Python學習交流群:531509025
import json
def get_stored_username():
'''如果儲存了使用者,就獲取它'''
filename = "username2.json"
try:
with open(filename,"r",encoding=("utf-8")) as f_obj:
usernames = json.load(f_obj)
except FileNotFoundError:
return None
else:
return usernames
def get_new_username():
'''提示使用者輸入使用者名稱'''
usernames = input("請輸入您的名字?")
filename = "username2.json"
with open(filename, "w", encoding=("utf-8")) as f_obj:
json.dump(usernames, f_obj)
def greet_user():
"""問候使用者並指出其名"""
usernames = get_stored_username()
if usernames:
print("歡迎%s登入系統..." % (usernames))
else:
get_new_username()
greet_user()
如此一來,每一個函式都執行了單一而清晰的任務。