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.異常的傳遞
- 異常的傳遞:當方法/函數執行出現異常,會將異常傳遞給函數/方法的調用一方
- 最終傳遞到
主程序
,仍然沒有異常處理,那么程序終止。
小提示
在開發中,可以在主函數增加異常捕獲,這樣就不需要在代碼中,增加大量的異常捕獲,能夠保持代碼整潔。
實例演練
- 定義函數
demo1()
提示用戶輸入一個整數並且返回 - 定義函數
demo2()
調用demo1()
- 在主程序中調用
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
對象 -
- 使用
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)
執行結果如下: