寫(xiě)在前面
在任何編程語(yǔ)言中都難免會(huì)遇到異常(報(bào)錯(cuò))始苇,如何查看報(bào)錯(cuò)砌烁、理解報(bào)錯(cuò)、避免報(bào)錯(cuò)催式、捕獲報(bào)錯(cuò)信息函喉,都是我們需要去應(yīng)對(duì)的環(huán)節(jié)。
一荣月、異常定義
異常:當(dāng)程序檢測(cè)到錯(cuò)誤時(shí)管呵,Python
解釋器就無(wú)法繼續(xù)執(zhí)行了,此時(shí)會(huì)出現(xiàn)一些錯(cuò)誤的提示哺窄,這就是所謂的”異尘柘拢”账锹,也就是我們常說(shuō)的BUG
。
例如最常見(jiàn)的bug坷襟,打錯(cuò)函數(shù)名稱:
pring("Biomamba")
# 這時(shí)就會(huì)返回報(bào)錯(cuò)奸柬,并告訴發(fā)生錯(cuò)誤的位置和具體原因
NameError: name ‘pring’ is not defined
二、異常捕獲
程序遇到bug
時(shí)會(huì)存在兩種情況:1婴程、終止程序廓奕。2、提醒出現(xiàn)的bug
并讓整個(gè)程序繼續(xù)運(yùn)行档叔。情況2就需要進(jìn)行異常捕獲
桌粉,從而防止整個(gè)程序因?yàn)橐恍┬ug而停止運(yùn)行
異常捕獲基本語(yǔ)法:
try:
可能錯(cuò)誤發(fā)生的代碼 except:
如果出現(xiàn)異常則執(zhí)行的代碼
# 捕獲異常(默認(rèn)不區(qū)分異常類型):
try:
prinf('這條代碼可能有異常')
except:
print("上條代碼有異常,本條被輸出")
# 可以看到以上幾行代碼沒(méi)有報(bào)錯(cuò)衙四,輸出的內(nèi)容則是except后的語(yǔ)句
## 上條代碼有異常铃肯,本條被輸出
# 捕獲指定異常
# 例如這里捕獲變量名稱未定義的異常"NameError"
try:
print(Biomamba)
except NameError as aerror:
print("Biomamba未被定義")
# 可以看到錯(cuò)誤成功被捕獲,且備選方案被執(zhí)行
## Biomamba未被定義
# 捕獲指定異常
# 這里我們讓異常不屬于NameError:
try:
print(1/0)
except NameError :
print("Biomamba未被定義")
# 可以看到錯(cuò)誤沒(méi)有被捕獲届搁,提示信息被輸出缘薛,備選代碼也沒(méi)有被執(zhí)行
ZeroDivisionError: division by zero
# 捕獲多個(gè)異常,except(異常1,異常2)
try:
print(1/0)
except(NameError,ZeroDivisionError):
print("這是備選代碼執(zhí)行結(jié)果")
# 可以看出備選代碼被成功執(zhí)行
## 這是備選代碼執(zhí)行結(jié)果
# 捕獲所有類型異常
try:
print(1/0)
print(Biomamba)
except Exception:
print("這是備選代碼執(zhí)行結(jié)果")
# 可以看出備選代碼被成功執(zhí)行
## 這是備選代碼執(zhí)行結(jié)果
三卡睦、異常else
除了except
之外宴胧,還可以設(shè)置沒(méi)有異常時(shí)選擇執(zhí)行的代碼:
try:
print("這里沒(méi)有異常")
except:
print("這是有異常后的執(zhí)行結(jié)果")
else:
print("這是沒(méi)有捕獲到異常的執(zhí)行結(jié)果")
# 大家可以體會(huì)一下上述幾行代碼的執(zhí)行邏輯
## 這里沒(méi)有異常
## 這是沒(méi)有捕獲到異常的執(zhí)行結(jié)果
四、異常finally
不管有沒(méi)有異常表锻,finally
所包含的語(yǔ)句均會(huì)被執(zhí)行:
# 有異常
try:
1/0
print("這里沒(méi)有異常")
except:
print("這是有異常后的執(zhí)行結(jié)果")
else:
print("這是沒(méi)有捕獲到異常的執(zhí)行結(jié)果")
finally:
print("我在所有條件下都會(huì)被執(zhí)行")
# 大家可以體會(huì)一下上述幾行代碼的執(zhí)行邏輯
## 這是有異常后的執(zhí)行結(jié)果
## 我在所有條件下都會(huì)被執(zhí)行
# 無(wú)異常
try:
1+1
print("這里沒(méi)有異常")
except:
print("這是有異常后的執(zhí)行結(jié)果")
else:
print("這是沒(méi)有捕獲到異常的執(zhí)行結(jié)果")
finally:
print("我在所有條件下都會(huì)被執(zhí)行")
# 大家可以體會(huì)一下上述幾行代碼的執(zhí)行邏輯
## 2
## 這里沒(méi)有異常
## 這是沒(méi)有捕獲到異常的執(zhí)行結(jié)果
## 我在所有條件下都會(huì)被執(zhí)行
五恕齐、異常傳遞
異常是具有傳遞性的,可以用as來(lái)定義接收異常的變量:
try:
1/0
except Exception as my_error:
print("異常被成功捕獲瞬逊,下面是異常的具體信息:\n")
print(my_error)
# 可以看到除數(shù)異常被成功捕獲
## 異常被成功捕獲显歧,下面是異常的具體信息:
##
## division by zero
# 但異常的捕獲是一個(gè)局部變量,跳出異常捕獲語(yǔ)句后捕獲的異常變量就失效了:
try:
1/0
except Exception as my_error:
print("異常被成功捕獲确镊,下面是異常的具體信息:\n")
print(my_error)
# 可以看到除數(shù)異常被成功捕獲士骤,但my_error變量不存在
NameError: name ‘my_error’ is not defined
NameError: name ‘my_error’ is not defined
往期回顧
一文了解Python基礎(chǔ):字面量、注釋蕾域、變量拷肌、類型、運(yùn)算符
如何聯(lián)系我們
公眾號(hào)后臺(tái)消息更新不及時(shí)旨巷,超過(guò)48h便不允許回復(fù)讀者消息巨缘,這里給大家留一下領(lǐng)取資料、免費(fèi)服務(wù)器(有root權(quán)限的共享服務(wù)器,注冊(cè)即送200¥)的微信號(hào)[Biomamba]采呐,方便各位隨時(shí)交流若锁、提建議(科研任務(wù)繁重,回復(fù)不及時(shí)請(qǐng)見(jiàn)諒)斧吐。此外呼聲一直很高的交流群也建好了又固,歡迎大家入群討論:永久免費(fèi)的千人生信仲器、科研交流群
大家可以閱讀完這幾篇之后添加
給生信入門初學(xué)者的小貼士
如何搜索公眾號(hào)過(guò)往發(fā)布內(nèi)容