異常
異常的概念
- 程序在運(yùn)行時(shí),如果
Python 解釋器
遇到 到一個(gè)錯(cuò)誤厕吉,會(huì)停止程序的執(zhí)行械念,并且提示一些錯(cuò)誤信息,這就是 異常 - 程序停止執(zhí)行并且提示錯(cuò)誤信息 這個(gè)動(dòng)作项钮,我們通常稱之為:拋出(raise)異常
程序開發(fā)時(shí)希停,很難將 所有的特殊情況 都處理的面面俱到脖苏,通過 異常捕獲 可以針對(duì)突發(fā)事件做集中的處理棍潘,從而保證程序的 穩(wěn)定性和健壯性
異常
捕獲異常:try except else finally
簡單的捕獲異常語法
- 在程序開發(fā)中亦歉,如果 對(duì)某些代碼的執(zhí)行不能確定是否正確畅哑,可以增加
try(嘗試)
來 捕獲異常
try:
嘗試執(zhí)行的代碼
except:
出現(xiàn)錯(cuò)誤的處理
-
try
嘗試,下方編寫要嘗試代碼赛蔫,不確定是否能夠正常執(zhí)行的代碼 -
except
如果不是泥张,下方編寫嘗試失敗的代碼
簡單異常捕獲1 —— 要求用戶輸入整數(shù)
try:
# 提示用戶輸入一個(gè)數(shù)字
num = int(input("請(qǐng)輸入數(shù)字:"))
except:
print("請(qǐng)輸入正確的數(shù)字")
錯(cuò)誤類型捕獲
- 在程序執(zhí)行時(shí)媚创,可能會(huì)遇到 不同類型的異常,并且需要 針對(duì)不同類型的異常鳄橘,做出不同的響應(yīng),這個(gè)時(shí)候瘫怜,就需要捕獲錯(cuò)誤類型了
try:
# 嘗試執(zhí)行的代碼
pass
except 錯(cuò)誤類型1:
# 針對(duì)錯(cuò)誤類型1,對(duì)應(yīng)的代碼處理
pass
except (錯(cuò)誤類型2, 錯(cuò)誤類型3):
# 針對(duì)錯(cuò)誤類型2 和 3弧关,對(duì)應(yīng)的代碼處理
pass
except Exception as result:
print("未知錯(cuò)誤 %s" % result)
- 當(dāng)
Python
解釋器 拋出異常 時(shí)世囊,最后一行錯(cuò)誤信息的第一個(gè)單詞窿祥,就是錯(cuò)誤類型
異常類型捕獲2 —— 要求用戶輸入整數(shù)
try:
num = int(input("請(qǐng)輸入整數(shù):"))
result = 8 / num
print(result)
except ValueError:
print("請(qǐng)輸入正確的整數(shù)")
except ZeroDivisionError:
print("除 0 錯(cuò)誤")
捕獲未知錯(cuò)誤
- 在開發(fā)時(shí),要預(yù)判到所有可能出現(xiàn)的錯(cuò)誤嗤瞎,還是有一定難度的
- 如果希望程序 無論出現(xiàn)任何錯(cuò)誤听系,都不會(huì)因?yàn)?
Python
解釋器 拋出異常而被終止,可以再增加一個(gè)except
語法如下:
except Exception as result:
print("未知錯(cuò)誤 %s" % result)
異常捕獲完整語法
- 在實(shí)際開發(fā)中掉瞳,為了能夠處理復(fù)雜的異常情況陕习,完整的異常語法如下:
try:
# 嘗試執(zhí)行的代碼
pass
except 錯(cuò)誤類型1:
# 針對(duì)錯(cuò)誤類型1址愿,對(duì)應(yīng)的代碼處理
pass
except 錯(cuò)誤類型2:
# 針對(duì)錯(cuò)誤類型2,對(duì)應(yīng)的代碼處理
pass
except (錯(cuò)誤類型3, 錯(cuò)誤類型4):
# 針對(duì)錯(cuò)誤類型3 和 4损合,對(duì)應(yīng)的代碼處理
pass
except Exception as result:
# 打印錯(cuò)誤信息
print(result)
else:
# 沒有異常才會(huì)執(zhí)行的代碼
pass
finally:
# 無論是否有異常娘纷,都會(huì)執(zhí)行的代碼
print("無論是否有異常,都會(huì)執(zhí)行的代碼")
else
只有在沒有異常時(shí)才會(huì)執(zhí)行的代碼finally
無論是否有異常土居,都會(huì)執(zhí)行的代碼之前一個(gè)演練的 完整捕獲異常 的代碼如下:
try:
num = int(input("請(qǐng)輸入整數(shù):"))
result = 8 / num
print(result)
except ValueError:
print("請(qǐng)輸入正確的整數(shù)")
except ZeroDivisionError:
print("除 0 錯(cuò)誤")
except Exception as result:
print("未知錯(cuò)誤 %s" % result)
else:
print("正常執(zhí)行")
finally:
print("執(zhí)行完成擦耀,但是不保證正確")
異常的傳遞
- 異常的傳遞 —— 當(dāng) 函數(shù)/方法 執(zhí)行 出現(xiàn)異常,會(huì) 將異常傳遞 給 函數(shù)/方法 的 調(diào)用一方
- 如果 傳遞到主程序分瘾,仍然 沒有異常處理吁系,程序才會(huì)被終止
提示:
- 在開發(fā)中,可以在主函數(shù)中增加 異常捕獲上岗,而在主函數(shù)中調(diào)用的其他函數(shù)蕴坪,只要出現(xiàn)異常,都會(huì)傳遞到主函數(shù)的異常捕獲中
- 這樣就不需要在代碼中呆瞻,增加大量的異常捕獲径玖,能夠保證代碼的整潔
'''
需求:
1\. 定義函數(shù) `demo1()` **提示用戶輸入一個(gè)整數(shù)并且返回**
2\. 定義函數(shù) `demo2()` 調(diào)用 `demo1()`
3\. 在主程序中調(diào)用 `demo2()`
'''
def demo1():
return int(input("請(qǐng)輸入一個(gè)整數(shù):"))
def demo2():
return demo1()
try:
print(demo2())
except ValueError:
print("請(qǐng)輸入正確的整數(shù)")
except Exception as result:
print("未知錯(cuò)誤 %s" % result)
拋出異常: raise
應(yīng)用場景
- 在開發(fā)中梳星,除了 代碼執(zhí)行出錯(cuò)
Python
解釋器會(huì) 拋出 異常之外 - 還可以根據(jù) 應(yīng)用程序 特有的業(yè)務(wù)需求 主動(dòng)拋出異常
示例
-
提示用戶 輸入密碼,如果 長度少于 8薯定,拋出 異常
[圖片上傳失敗...(image-3d2a0b-1542201966092)]
拋出異常
-
Python
中提供了一個(gè)Exception
異常類 - 在開發(fā)時(shí)瞳购,如果滿足 特定業(yè)務(wù)需求時(shí)学赛,希望 拋出異常吞杭,由其他需要處理的函數(shù)捕獲異常,可以:
-
創(chuàng)建 一個(gè)
Exception
的 對(duì)象 - 使用
raise
關(guān)鍵字 拋出 異常對(duì)象
-
創(chuàng)建 一個(gè)
'''
**需求**
* 定義 `input_password` 函數(shù)绢掰,提示用戶輸入密碼
* 如果用戶輸入長度 < 8,拋出異常
* 如果用戶輸入長度 >=8攻晒,返回輸入的密碼
'''
def input_password():
# 1\. 提示用戶輸入密碼
pwd = input("請(qǐng)輸入密碼:")
# 2\. 判斷密碼長度班挖,如果長度 >= 8,返回用戶輸入的密碼
if len(pwd) >= 8:
return pwd
# 3\. 密碼長度不夠给梅,需要拋出異常
# 1> 創(chuàng)建異常對(duì)象 - 使用異常的錯(cuò)誤信息字符串作為參數(shù)
ex = Exception("密碼長度不夠")
# 2> 拋出異常對(duì)象
raise ex
try:
user_pwd = input_password()
print(user_pwd)
except Exception as result:
print("發(fā)現(xiàn)錯(cuò)誤:%s" % result)