什么是異常
成都創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來(lái)公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過(guò)去的10多年時(shí)間我們累計(jì)服務(wù)了上千家以及全國(guó)政企客戶,如火鍋店設(shè)計(jì)等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過(guò)硬的技術(shù)實(shí)力獲得客戶的一致贊揚(yáng)。程序運(yùn)行過(guò)程中,產(chǎn)生的錯(cuò)誤統(tǒng)稱為異常(bug)。這些異常有的可能是語(yǔ)法錯(cuò)誤,如關(guān)鍵字輸入錯(cuò)誤、調(diào)用錯(cuò)誤等,這一類的異常都是顯式的,很好發(fā)現(xiàn);還有一種就是隱式的錯(cuò)誤,只用在使用時(shí)才會(huì)被發(fā)現(xiàn),和使用者的操作有關(guān)。
下面介紹一下 Python 常見(jiàn)的異常提示:
異常類型.jpg
異常處理語(yǔ)句
try … except …
在使用時(shí),將可能產(chǎn)生異常的代碼放在 try 語(yǔ)句中,把處理結(jié)果放在 except 語(yǔ)句中,這樣,當(dāng) try 后面的代碼發(fā)生錯(cuò)誤時(shí)就會(huì)執(zhí)行 except 中的代碼。如果 try 后的代碼沒(méi)有異常,則不會(huì)執(zhí)行 except 后的代碼。
try:
do some things
except exceptionName:
do some things
exceptionName 用于指定可能出現(xiàn)的異常的名稱。如果不指定異常的名稱,則表示捕獲全部可能發(fā)生的異常。
示例代碼:
def division():
print("====== 開(kāi)始分蘋(píng)果 ======")
apple = int(input("一共有幾個(gè)大蘋(píng)果:"))
child = int(input("一共有幾個(gè)小朋友:"))
result = apple // child
remain = apple % child
if remain > 0:
print("一共 {:d} 個(gè)大蘋(píng)果平均分給 {:d} 個(gè)小朋友,每人 {:d} 個(gè),剩余 {:d} 個(gè)。".format(apple, child, result, remain))
else:
print("一共 {:d} 個(gè)大蘋(píng)果平均分給 {:d} 個(gè)小朋友,每人 {:d} 個(gè)。".format(apple, child, result))
if name == "main":
try:
division()
except ZeroDivisionError:
print("蘋(píng)果不能被 0 個(gè)小朋友平分?。。?)
在捕獲異常的時(shí)候,可以同時(shí)捕獲多個(gè)異常,如:
try:
do some things
except(ValueError, ZeroDivisionError) as e:
do some things
try … except … else
該語(yǔ)句在 except 之后加了一個(gè) else 語(yǔ)句,用于指定當(dāng) try 語(yǔ)句沒(méi)有發(fā)現(xiàn)異常時(shí)需要執(zhí)行的代碼,如果 try 語(yǔ)句中發(fā)現(xiàn)了異常,則不再執(zhí)行 else 之后的代碼。
try:
do some things
except exceptionName:
do some things
else:
do some things
示例代碼:
def division():
print("====== 開(kāi)始分蘋(píng)果 ======")
apple = int(input("一共有幾個(gè)大蘋(píng)果:"))
child = int(input("一共有幾個(gè)小朋友:"))
result = apple // child
remain = apple % child
if remain > 0:
print("一共 {:d} 個(gè)大蘋(píng)果平均分給 {:d} 個(gè)小朋友,每人 {:d} 個(gè),剩余 {:d} 個(gè)。".format(apple, child, result, remain))
else:
print("一共 {:d} 個(gè)大蘋(píng)果平均分給 {:d} 個(gè)小朋友,每人 {:d} 個(gè)。".format(apple, child, result))
if name == "main":
try:
division()
except ZeroDivisionError:
print("蘋(píng)果不能被 0 個(gè)小朋友平分?。?!")
except ValueError as e:
print("輸入錯(cuò)誤?。?!", e)
else:
print("蘋(píng)果分配成功。。。")
try … except … finally
無(wú)論 try 語(yǔ)句中是否發(fā)生異常,都會(huì)執(zhí)行 finally 之后的代碼。
try:
do some things
except exceptionName:
do some things
finally:
do some things
示例代碼:
def division():
print("====== 開(kāi)始分蘋(píng)果 ======")
apple = int(input("一共有幾個(gè)大蘋(píng)果:"))
child = int(input("一共有幾個(gè)小朋友:"))
result = apple // child
remain = apple % child
if remain > 0:
print("一共 {:d} 個(gè)大蘋(píng)果平均分給 {:d} 個(gè)小朋友,每人 {:d} 個(gè),剩余 {:d} 個(gè)。".format(apple, child, result, remain))
else:
print("一共 {:d} 個(gè)大蘋(píng)果平均分給 {:d} 個(gè)小朋友,每人 {:d} 個(gè)。".format(apple, child, result))
if name == "main":
try:
division()
except ZeroDivisionError:
print("蘋(píng)果不能被 0 個(gè)小朋友平分?。?!")
except ValueError as e:
print("輸入錯(cuò)誤?。。?, e)
else:
print("蘋(píng)果分配成功。。。")
finally:
print("分配了一次蘋(píng)果。")
raise
如果某個(gè)函數(shù)可能會(huì)產(chǎn)生異常,但是不想在當(dāng)前函數(shù)中處理該異常,則可以使用 raise 語(yǔ)句在函數(shù)中拋出異常,
raise [exceptionName[(reason)]]
其中,exceptionName[(reason)] 為可選參數(shù),用于指定拋出的異常名稱及異常信息的描述,如果省略則把異常原樣拋出。
示例代碼:
def division():
print("====== 開(kāi)始分蘋(píng)果 ======")
apple = int(input("一共有幾個(gè)大蘋(píng)果:"))
child = int(input("一共有幾個(gè)小朋友:"))
if apple < child:
raise ValueError("蘋(píng)果太少了不夠分!")
result = apple // child
remain = apple % child
if remain > 0:
print("一共 {:d} 個(gè)大蘋(píng)果平均分給 {:d} 個(gè)小朋友,每人 {:d} 個(gè),剩余 {:d} 個(gè)。".format(apple, child, result, remain))
else:
print("一共 {:d} 個(gè)大蘋(píng)果平均分給 {:d} 個(gè)小朋友,每人 {:d} 個(gè)。".format(apple, child, result))
if name == "main":
try:
division()
except ZeroDivisionError:
print("蘋(píng)果不能被 0 個(gè)小朋友平分?。?!")
except ValueError as e:
print("輸入錯(cuò)誤!??!", e)
else:
print("蘋(píng)果分配成功。。。")
finally:
print("分配了一次蘋(píng)果。")
程序測(cè)試
使用 IDE 調(diào)試
基本上所有的 IDE 都具有代碼調(diào)試功能,如 Python 自帶的 IDLE 和 PyCharm 等等。一般都是在出現(xiàn)異常的地方設(shè)置斷點(diǎn),然后在此處查看數(shù)據(jù)的值是否正確。具體的內(nèi)容我也在學(xué)習(xí)過(guò)程中,沒(méi)有可以調(diào)試的代碼,以后如果有資料了在進(jìn)行補(bǔ)充。
使用 assert 語(yǔ)句調(diào)試
該語(yǔ)句一般用于對(duì)程序在某個(gè)時(shí)刻必須滿足的條件進(jìn)行驗(yàn)證,
1
assert expression [reason]
其中,expression 是一個(gè)條件表達(dá)式,如果為假則拋出 AssertError 異常,反之則什么都不做。reason 為可選參數(shù),用于描述前面的 expression 為了更好的知道哪里出現(xiàn)了錯(cuò)誤。
示例代碼:
def division():
print("====== 開(kāi)始分蘋(píng)果 ======")
apple = int(input("一共有幾個(gè)大蘋(píng)果:"))
child = int(input("一共有幾個(gè)小朋友:"))
assert apple > child, "蘋(píng)果不夠分。"
result = apple // child
remain = apple % child
if remain > 0:
print("一共 {:d} 個(gè)大蘋(píng)果平均分給 {:d} 個(gè)小朋友,每人 {:d} 個(gè),剩余 {:d} 個(gè)。".format(apple, child, result, remain))
else:
print("一共 {:d} 個(gè)大蘋(píng)果平均分給 {:d} 個(gè)小朋友,每人 {:d} 個(gè)。".format(apple, child, result))
if name == "main":
try:
division()
except ZeroDivisionError:
print("蘋(píng)果不能被 0 個(gè)小朋友平分?。?!")
except ValueError as e:
print("輸入錯(cuò)誤!??!", e)
else:
print("蘋(píng)果分配成功。。。")
finally:
print("分配了一次蘋(píng)果。")
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。