Python教程:異常捕捉與程式碼重構

python学习者0發表於2024-08-15

異常

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()

如此一來,每一個函式都執行了單一而清晰的任務。

相關文章