標籤:突發事件 沒有 使用者輸入 異常類 for error: 不同類 raise 穩定性
目標
01,異常的概念
- 程式在運行時,如果
python 解譯器 遇到 一個錯誤,會停止程式的執行,並且提示一些錯誤資訊,這就是異常
- 程式停止執行並且提示錯誤資訊 這個動作,我們通常稱之為:拋出(raise)異常
注 程式開發時,很難將 所有的特殊情況 都處理的面面俱到,通過 異常捕捉 可以針對突發事件做集中的處理,從而保證程式的 穩定性和健壯性
02,捕獲異常2.1 簡單的捕獲異常文法
- 在程式開發中,如果 對某些代碼的執行不能確定是否正確,就可以增加
try(嘗試) 來 捕獲異常
- 捕獲異常最簡單的文法格式:
try: 嘗試執行的代碼except: 出現錯誤的處理
try 嘗試,下方編寫要嘗試代碼,不確定是否能夠正常執行的代碼
except 如果不是,下方編寫嘗試失敗的代碼
簡單異常捕捉演練 - - 要去使用者輸入整數
try: # 提示使用者輸入數字 num = int(input("請輸入數字:")) except: print("輸入有誤,請輸入正確的數字") print("-" * 50) # 結果呈現 請輸入數字:1 -------------------------------------------------- 請輸入數字:a 輸入有誤,請輸入正確的數字 --------------------------------------------------
2.2 錯誤類型捕捉
- 在程式執行時,可能會遇到 不同類型的異常,並且需要 針對不同類型的異常,做出不同的響應,這個時候,就需要捕獲錯誤類型
- 文法如下:
try: # 嘗試執行的代碼 passexcept 錯誤類型1: # 針對錯誤類型1,對應的代碼處理 passexcept (錯誤類型2, 錯誤類型3): # 針對錯誤類型2 和 3 處理的代碼 passexcept Exception as result: print("未知錯誤 %s" % result)
- 當
Python 解譯器 拋出異常 時,最後一行錯誤資訊的第一個單詞,就是錯誤類型
異常類型捕獲演練 - - 要求使用者輸入整數
要求
1,提示使用者輸入一個整數
2,使用 8 除以使用者輸入的整數並且輸出
try: # 1,提示使用者輸入一個整數 num = int(input("輸入一個整數:")) # 2,使用 ````8```` 除以使用者輸入的整數並且輸出 result = 8 / num print(result) except ZeroDivisionError: print("除0錯誤") except ValueError: print("請輸入正確的整數") # 結果呈現 輸入一個整數:0 除0錯誤 輸入一個整數:a 請輸入正確的整數
捕獲未知錯誤
except Exception as result: print("未知錯誤 %s" % result)
try: # 1,提示使用者輸入一個整數 num = int(input("輸入一個整數:")) # 2,使用 ````8```` 除以使用者輸入的整數並且輸出 result = 8 / num print(result) # except ZeroDivisionError: # print("除0錯誤") except ValueError: print("請輸入正確的整數") except Exception as result: print("未知錯誤 %s " % result) # 結果呈現 輸入一個整數:0 未知錯誤 division by zero
2.3 異常捕獲完整文法
- 在實際開發中,為了能夠處理複雜的異常情況,完整的異常文法如下:
try: # 嘗試執行的代碼 passexcept 錯誤類型1: # 針對錯誤類型1,對應的代碼處理 passexcept (錯誤類型2, 錯誤類型3): # 針對錯誤類型2 和 3 處理的代碼 passexcept Exception as result: print("未知錯誤 %s" % result)else: # 沒有異常才會執行的代碼 passfinally: # 無論是否有異常,都會執行的代碼 print("無論是否有異常,都會執行的代碼")
else 只有在沒有異常時才會執行的代碼
finally 無論是否有異常,都會執行的代碼
try: # 1,提示使用者輸入一個整數 num = int(input("輸入一個整數:")) # 2,使用 ````8```` 除以使用者輸入的整數並且輸出 result = 8 / num print(result) # except ZeroDivisionError: # print("除0錯誤") except ValueError: print("請輸入正確的整數") except Exception as result: print("未知錯誤 %s " % result) else: print("嘗試成功") finally: print("無論是否有異常,都會執行的代碼") print("-" * 20) # 結果呈現 輸入一個整數:q 請輸入正確的整數 無論是否有異常,都會執行的代碼 -------------------- 輸入一個整數:0 未知錯誤 division by zero 無論是否有異常,都會執行的代碼 -------------------- 輸入一個整數:1 8.0 嘗試成功 無論是否有異常,都會執行的代碼 --------------------
03,異常的傳遞
- 異常的傳遞 - - 當 函數/方法 執行 出現異常 ,會 將異常傳遞 給 函數/方法 的 調用一方
- 如果 傳遞到主程式,仍然 沒有異常處理,程式才會被終止
提示
- 在開發中,可以在主函數中增加 異常捕獲
- 而在主函數中調用的其它函數,只要出現異常,都會傳遞到主函數的 異常捕獲 中
- 這樣就不需要在代碼中,增加大量的 異常捕獲,能夠保證代碼的整潔
需求
1,定義函數 demo1() 提示使用者輸入一個整數並且返回
2,定義函數 demo2() 調用 demo1()
3,在主程式中調用 demo2()
def demo1(): return int(input("請輸入一個整數:")) def demo2(): return demo1() try: print(demo2()) except Exception as result: print("未知錯誤:%s" % result) # 結果呈現 請輸入一個整數:q 未知錯誤:invalid literal for int() with base 10: ‘q‘
04,拋出 raise 異常4.1 應用情境
- 在開發中,除了 代碼執行出錯
python 解譯器會 拋出 異常之外
- 還可以根據 應用程式 特有的業務需求 主動拋出異常
樣本
- 提示使用者 輸入密碼,如果 長度少於8,拋出 異常
注意
- 當前函數 只負責 提示使用者輸入密碼,如果 密碼長度不正確,需要其它的函數做額外處理
- 因此可以 拋出異常,有其它需要處理的函數 捕獲異常
4.2 拋出異常
python 中提供 了一個 Exception 異常類
- 在開發時,如果滿足 特定業務需求時,希望 拋出異常,可以:
- 建立 一個
Exception 的對象
- 使用
raise 關鍵字 拋出 異常對象
需求
- 定義
input_password 函數,提示使用者輸入密碼
- 如果使用者輸入長度 < 8 ,拋出異常
- 如果使用者輸入長度 >= 8 ,返回輸入的密碼
def input_password(): # 1,提示使用者輸入密碼 pwd = input("請輸入密碼: ") # 2, 如果使用者輸入長度 >= 8 ,返回輸入的密碼 if len(pwd) >= 8: return pwd # 3, 如果使用者輸入長度 < 8 ,拋出異常 print("主動拋出異常") # 1> 建立異常對象 - 可以使用錯誤字串作為參數 ex = Exception("密碼長度不夠") # 1> 主動拋出異常 raise ex try: print(input_password()) except Exception as result: print(result) # 結果呈現 請輸入密碼: 12345678 12345678 請輸入密碼: 123 主動拋出異常 密碼長度不夠
Python 物件導向 --- 異常