異常就是程序運(yùn)行錯(cuò)誤或者邏輯混亂,返回了錯(cuò)誤的代碼,為了不讓用戶看到錯(cuò)誤的代碼,所以需要對(duì)異常的代碼進(jìn)行錯(cuò)誤處理
出現(xiàn)了異常,程序就不在往下執(zhí)行。
python捕獲異常 用 try except 語(yǔ)句 如上圖
try 語(yǔ)句中是可能出現(xiàn)異常的代碼
except 語(yǔ)句中是對(duì)程序異常的處理 ,可以有多個(gè)異常,放在元組中存儲(chǔ)
完整的異常捕獲語(yǔ)句 如下:
try:
有可能出現(xiàn)異常的代碼
except 捕獲的異常名:
處理異常
else:
沒有異常就執(zhí)行這里的語(yǔ)句,可以不寫
finally:
這個(gè)語(yǔ)句塊里的代碼,不管有沒有異常,都會(huì)執(zhí)行 必須執(zhí)行的代碼可以寫在這里 如 文件關(guān)閉
異常的傳遞 :
異常的嵌套 :
函數(shù)的嵌套調(diào)用try :
#########第一種情況;
########第二種情況 :
自定義異常
通過(guò)繼承異常類,就可以自定義異常
可以用raise 語(yǔ)句來(lái)觸發(fā)(拋出)一個(gè)異常。異?;蛘咤e(cuò)誤對(duì)象必須有一個(gè)名字,應(yīng)該繼承Exceprion或者是Error類
class NameInputException(Exception):
#自定義異常類NameInputException,繼承Exception類
def __init__(self,msg):# 一個(gè)參數(shù) msg 信息
self.msg=msg
class GenderException(Exception):
#自定義異常類GenderException,繼承Exception類
def init(self,msg): # 一個(gè)參數(shù),msg 信息
self.msg=msg
def Input():
try :
name = input('輸入名字:')
if len(name)<3:
#判斷如果輸入的名字長(zhǎng)度小于3 拋出異常NameInputException
是一個(gè)異常對(duì)象(參數(shù))
raise 觸發(fā)拋出 不在往下執(zhí)行
raise NameInputException('長(zhǎng)度至少是3 輸入的長(zhǎng)度是%s'%len(name))
except NameInputException as ni:
#有自己的捕獲語(yǔ)句,就使用自己的,執(zhí)行自有的語(yǔ)句處理異常信息
print('NameError 自己捕獲執(zhí)行 %s'%ni)
else:
gender = input('輸入性別:')
if gender !='男' and gender !='女':
#判斷輸入的性別信息,如果輸入的不是男 或 女 拋出異常GenderException
是一個(gè)異常對(duì)象,自己沒有捕獲異常的方式,raise 觸發(fā)向外拋出異常
raise GenderException('請(qǐng)輸入正常選項(xiàng):男或女 ,你輸入的是%s'%gender)
#######def main():
try:
Input()
#執(zhí)行語(yǔ)句,捕獲到拋出的異常 執(zhí)行處理異常信息的語(yǔ)句
except Exception as ex:
print('genderError 接盤俠 %s 執(zhí)行'%ex)
main()
一些常見的異常
Exception 基礎(chǔ)異常
ZeroDivisionError 除數(shù)為0異常
OverflowError 內(nèi)存溢出
ImportError 導(dǎo)入模塊異常
NameError 沒有聲明對(duì)象
RuntimeError 一般運(yùn)行時(shí)異常
NotImplementedError 未實(shí)現(xiàn)方法
SyntaxError 語(yǔ)法錯(cuò)誤
IOError IO操作異常
...