【Python】異常處理


01.異常的概念

程序在運行的時候,遇到錯誤導致程序停止運行時,這就是異常
程序停止運行,並且提示錯誤信息這個動作,我們稱為:拋出(raise)異常

程序開發的時候,很難一次性考慮到所有的特殊情況,通過異常捕獲可以對突發事件做集中處理,從而保證程序的穩定性和健壯性

02.捕獲異常

2.1 簡單的捕獲異常

語法如下:

try:
    執行的代碼
except:
    出現錯誤的處理
  • try嘗試,下方編寫需要執行的代碼,不確定是否能夠正常執行
  • except如果不是,下方編寫嘗試失敗的代碼

異常處理實戰演練----要求用戶輸入整數

try:
    input_num = int(input("請輸入一個數字:"))
except:
    print("您輸入的是非數字!")

2.1 錯誤類型捕獲

在執行程序的時候,可能會遇到不同錯誤類型的代碼,例如:分母不能為0,文件找不到等不同錯誤類型。這個時候就需要對不同的錯誤類型做出不同的性響應。
語法如下:

try:
    # 嘗試執行的代碼
    pass
except 錯誤類型1:
    # 針對錯誤類型1,對應的代碼處理
    pass
except 錯誤類型2,錯誤類型3:
    # 針對錯誤類型2和3,對應的代碼處理
    pass
except Exception as result:
    print("未知錯誤 %s" % result)

異常類型捕獲實戰演練-----要求用戶輸入整數

try:
    input_num = int(input("請輸入一個數字:"))
    result = 10 / input_num
    print(result)
except ValueError:
    print("請輸入正確的數字!")
except ZeroDivisionError:
    print("分母不能為0,請輸入非0數字")
except Exception as result:
    print("未知錯誤:%s " % result)

最后的except是一個兜底的異常處理,無論程序出現什么錯誤,都不會因為Python解釋器拋出異常而終止

2.3 異常處理的完整語法

try:
    # 嘗試執行的代碼
    pass
except 錯誤類型1:
    # 針對錯誤類型1,對應的代碼處理
    pass
except 錯誤類型2:
    # 針對錯誤類型2,對應的代碼處理
    pass
except (錯誤類型3, 錯誤類型4):
    # 針對錯誤類型3 和 4,對應的代碼處理
    pass
except Exception as result:
    # 打印錯誤信息
    print(result)
else:
    # 沒有異常才會執行的代碼
    pass
finally:
    # 無論是否有異常,都會執行的代碼
    print("無論是否有異常,都會執行的代碼")

其中,else表示沒有異常時才會執行的代碼,finally表示無論有沒有異常,都會執行代碼
基於2.2中的代碼進一步改造后的代碼如下:

try:
    input_num = int(input("請輸入一個數字:"))
    result = 10 / input_num
    print(result)
except ValueError:
    print("請輸入正確的數字!")
except ZeroDivisionError:
    print("分母不能為0,請輸入非0數字")
except Exception as result:
    print("未知錯誤:%s " % result)
else:
    print("萬幸啊!此次運行無異常。")
finally:
    print("我只知道程序執行完了,至於執行的對不對我就不知道了!")

03.異常的傳遞

  • 異常的傳遞:當方法/函數執行出現異常,會將異常傳遞給函數/方法的調用一方
  • 最終傳遞到主程序,仍然沒有異常處理,那么程序終止。

小提示
在開發中,可以在主函數增加異常捕獲,這樣就不需要在代碼中,增加大量的異常捕獲,能夠保持代碼整潔。

實例演練

  1. 定義函數 demo1() 提示用戶輸入一個整數並且返回
  2. 定義函數 demo2() 調用 demo1()
  3. 在主程序中調用 demo2()
def demo1():
    return int(input("請輸入一個整數:"))


def demo2():
    return demo1()

try:
    print(demo2())
except ValueError:
    print("請輸入正確的整數")
except Exception as result:
    print("未知錯誤 %s" % result)

04.拋出異常

在實際的應用場景中,除了代碼出錯Python解釋器會拋出異常之外,我們還可以根據自己的業務需求自定義異常並主動拋出
拋出異常的2個步驟:

  • 1)創建一個Exception對象
    1. 使用raise關鍵字拋出異常對象

實戰演練----輸入的密碼少於6位
需求:

  • 定義一個函數input_pwd,提示用戶輸入密碼
  • 如果用戶輸入的密碼少於6位,拋出異常
  • 如果用戶輸入的密碼大於等於6位,則返回輸入的密碼
def input_pwd():
    # 1.提示用戶輸入密碼
    pwd  = input("請輸入密碼:")

    # 2.判斷密碼長度,如果長度 >= 6,返回用戶輸入的密碼
    if len(pwd) > 6:
        return pwd
    # 3.密碼長度小於6位,則需要拋出異常

    # 創建異常對象
    ex = Exception("密碼長度小於6位")

    # 拋出異常對象
    raise ex

# 調用函數
try:
    user_pwd = input_pwd()
    print(user_pwd)
except Exception as e:
    print(e)

執行結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM