在程序的編寫過程中會(huì)出現(xiàn)各種錯(cuò)誤甘穿,語(yǔ)法錯(cuò)誤在程序啟動(dòng)時(shí)就會(huì)檢測(cè)出來盖奈,它是程序正常運(yùn)行的前提條件。
程序中還有一種錯(cuò)誤發(fā)生在程序運(yùn)行后第献,可能是由于邏輯問題,又或者是業(yè)務(wù)發(fā)生了改變兔港,為了能讓用戶有更好的體驗(yàn)庸毫,加強(qiáng)代碼的健壯性,我們需要對(duì)這些錯(cuò)誤進(jìn)行處理衫樊,也叫異常處理飒赃。
回憶我們前面關(guān)于成績(jī)?cè)u(píng)價(jià)的案例,當(dāng)用戶輸入非數(shù)值時(shí)程序會(huì)發(fā)生什么?
>>> score = input('請(qǐng)輸入你的成績(jī)>>>:')
請(qǐng)輸入你的成績(jī)>>>:A
>>> score = float(score) # 轉(zhuǎn)換類型
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 'A'
代碼直接報(bào)錯(cuò)盒揉,原因是輸入的是字符串晋被,不能轉(zhuǎn)換成浮點(diǎn)數(shù)。
通過異常處理刚盈,可以在用戶輸入非法數(shù)值是進(jìn)行提示羡洛,使程序有更好的體驗(yàn)。
在python中通過try-except
語(yǔ)句進(jìn)行異常處理藕漱,基本的語(yǔ)法格式如下:
try:
<語(yǔ)句塊1>
except <異常類型1>:
<語(yǔ)句塊2>
except <異常類型2>:
<語(yǔ)句塊3>
語(yǔ)句塊1中的代碼如果發(fā)生異常欲侮,且異常與類型對(duì)應(yīng)的except
語(yǔ)句的異常類型相同則會(huì)被其捕獲,從而執(zhí)行對(duì)應(yīng)的語(yǔ)句塊肋联。
>>> score = input('請(qǐng)輸入你的成績(jī)>>>:')
請(qǐng)輸入你的成績(jī)>>>:A
>>> try:
... score = float(score)
... except ValueError as e:
... print(e)
... print('請(qǐng)輸入正確的成績(jī)')
could not convert string to float: 'A'
請(qǐng)輸入正確的成績(jī)
除了try
和except
關(guān)鍵字外威蕉,異常語(yǔ)句還可以與else
和finally
關(guān)鍵字配合使用,語(yǔ)法格式如下:
try:
<語(yǔ)句塊1>
except <異常類型>:
<語(yǔ)句塊2>
...
else:
<語(yǔ)句塊3>
finally:
<語(yǔ)句塊4>
完整的執(zhí)行流程圖如下:
沒有發(fā)生異常時(shí)橄仍,會(huì)執(zhí)行else
語(yǔ)句后的代碼塊,不管有沒有發(fā)生異常韧涨,finally
語(yǔ)句后的代碼塊一定會(huì)執(zhí)行、
try:
a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
index = input('請(qǐng)輸入一個(gè)正整數(shù)>>>:')
index = int(index)
print(a[index])
except Exception as e:
print(e)
print('請(qǐng)輸入一個(gè)正整數(shù)')
else:
print('沒有發(fā)生異常')
finally:
print('我一定會(huì)執(zhí)行')
上面的代碼當(dāng)輸入的數(shù)不符合規(guī)則侮繁,或者輸入的整數(shù)大于字符串的所有虑粥,都會(huì)拋出異常,然后會(huì)被捕獲宪哩,else
語(yǔ)句里的代碼不會(huì)執(zhí)行娩贷,但是finally
里的代碼會(huì)執(zhí)行。