詳解 python 的異常

捕獲異常

如果對某些代碼的執行不能確定是否正確,可以用try來捕獲異常
格式爲:

try:
    不能確定能否正確執行的代碼
except:
    出現錯誤的處理

例:要求用戶輸出整數,結果用戶卻輸入一個字母,這就是在編寫程序沒有語法錯誤的情況下,產生的異常,代碼如下:

try:
    #提示用戶輸入一個數字
    num = int(input("請輸入數字:"))

except:
    print("請輸入正確的數字")

print("_"*50)

當輸入爲數字時,輸入正確,可以打印分割線,輸出結果如下:
在這裏插入圖片描述當輸入爲字母時,輸入格式是錯的,但是也可以打印分割線,輸出結果如下:
在這裏插入圖片描述
所以,無論程序是否發生錯誤,程序還是會繼續執行下去


錯誤類型捕獲

  • 在程序執行時,可能會遇到不同類型的異常,並且需要針對不同類型的異常,做出不同的響應,這個時候,就需要捕獲錯誤類型
  • 語法如下:
try:
    #嘗試執行的代碼
    pass
except 錯誤類型1:
    #針對錯誤類型1,對應的代碼處理
    pass
except (錯誤類型2, 錯誤類型3):
    #針對錯誤類型2 和3,對應的代碼處理
    pass
except Exception as result:
    print("未知錯誤 %s" % result)
  • 當python解釋器拋出異常時,最後一行錯誤信息到的第一個單詞,就是錯誤類型

例:提示用戶輸入一個整數,使用8除以用戶輸入的整數並且輸出
代碼如下:

num = int(input("輸入一個整數:"))
#使用8除以用戶輸入的整數並且輸出
result = 8 / num
print(result)

分析:顯而易見,當分母爲0時,當輸入的爲字母或非整數,是錯誤的
那麼我們就要先輸入一個0,運行,然後得出錯誤的類型,就是最後一行錯誤信息到的第一個單詞,如下:
在這裏插入圖片描述那麼我們就可以修改代碼爲:

try:
    # 提示用戶輸入一個整數
    num = int(input("輸入一個整數:"))
    #使用8除以用戶輸入的整數並且輸出
    result = 8 / num
    print(result)
    

 - List item

except ZeroDivisionError:
    print("除0錯誤")

運行結果如下:
在這裏插入圖片描述

再通過同樣的方法,以此類推,得出輸入的爲字母或非整數,錯誤類型爲:ValueError ,所以我們修改代碼爲:

    # 提示用戶輸入一個整數
    num = int(input("輸入一個整數:"))
    #使用8除以用戶輸入的整數並且輸出
    result = 8 / num
    print(result)

except ZeroDivisionError:
    print("除0錯誤")

except ValueError:
    print("請輸入正確的整數")

當輸入爲字母或非整數時,運行結果如下:
在這裏插入圖片描述在這裏插入圖片描述

  • 但是,在開發時,要預判到所有很能出現的錯誤還是有難度的
  • 我們希望程序無論出現何種錯誤,都不會因爲python解釋器拋出異常而被終止,所以,我們可以再增加一個except,語法如下:
except Exception as result:
    print("未知錯誤 %s" % result)

現在假設,我們在開發時,沒有提前預判到除0錯誤,我們又想程序無論出現何種錯誤,都不會因爲python解釋器拋出異常而被終止,所以,我們再增加一個except,代碼如下:

try:
    # 提示用戶輸入一個整數
    num = int(input("輸入一個整數:"))
    #使用8除以用戶輸入的整數並且輸出
    result = 8 / num
    print(result)

except ValueError:
    print("請輸入正確的整數")

except Exception as result:
    print("未知錯誤 %s" % result)

當輸入0時,運行結果如下:
在這裏插入圖片描述


異常捕獲的完整語法

try:
    #嘗試執行的代碼
    pass

except 錯誤類型1:
    #針對錯誤類型1,對應的代碼處理
    pass

except (錯誤類型2, 錯誤類型3):
    #針對錯誤類型2 和3,對應的代碼處理
    pass

except Exception as result:
    #打印錯誤信息
    print("未知錯誤 %s" % result)
    
else:
    #沒有異常纔會執行的代碼
    pass

finally:
    #無論是否有異常,都會執行的代碼
    print("無論是否有異常,都會執行的代碼")

繼續完善我們的例子:

try:
    # 提示用戶輸入一個整數
    num = int(input("輸入一個整數:"))
    #使用8除以用戶輸入的整數並且輸出
    result = 8 / num
    print(result)

except ValueError:
    print("請輸入正確的整數")

except Exception as result:
    print("未知錯誤 %s" % result)

else:
    print("嘗試成功")
finally:
    print("無論是否出現錯誤都會執行的代碼")

print("_" * 50)

運行結果如下:
在這裏插入圖片描述在這裏插入圖片描述


異常的傳遞

  • 當一個 函數/方法 出現異常時,會將異常傳遞給 函數/方法 的調用的一方
  • 這樣一層一層向上傳遞,傳遞到主程序,仍然沒有異常處理,程序纔會被終止
  • 在開發中,可以在主程序中增加異常捕獲
  • 而在主程序中調用的其他函數,只要出現異常,都會傳遞到主函數的 異常捕獲 中
  • 這樣就不需要在代碼中,增加大量的異常捕獲,這樣能保持代碼的整潔

代碼如下:

def demo1():
    return int(input("輸入整數:"))

def demo2():
    return demo1()

#利用異常的傳遞性,在主程序中捕獲異常
try:
    print(demo2())
except Exception as result:
    print("未知錯誤 %s" % result)

運行結果如下:
在這裏插入圖片描述


主動拋出異常

  • 在開發中,除了代碼執行出錯python解釋器會拋出異常之外
  • 還可以根據應用程序 特有的業務需求 主動拋出異常

主動拋出異常的步驟:

  1. 使用Exception這個類(Exception這個類是python中專門針對異常提供的類)來創建一個異常對象
  2. 使用raise關鍵字拋出異常對象

例:定義input_password函數,提示用戶輸入密碼,若用戶輸入長度<8,拋出異常,若用戶輸入長度>=8,則返回輸入的密碼
代碼如下:

def input_password():
    #1.提示用戶輸入密碼
    pwd = input("請輸入密碼:")
    #2.判斷密碼長度>=8,返回用戶輸入的密碼
    if len(pwd) >= 8:
        return pwd

    #3.若密碼長度<8,主動拋出異常
    print("主動拋出異常")
        #創建異常對象:可以使用錯誤信息字符串作爲參數
    ex = Exception("密碼長度不夠")
        #主動拋出異常
    raise ex

#提示用戶輸入密碼
try:
    print(input_password())
except Exception as result:
    print(result)

當輸入密碼小於8位時,運行結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章