1:概念:異常就是程序運行錯誤或則邏輯混亂
在python中完残,當python檢測到一個錯誤時突倍,解釋器就無法正常運行妖滔,會出現(xiàn)一些錯誤提示,這就是異常氢惋。
2.1異常捕獲
try...except....
例子:
try:
? ? print('-----test--1---')
? ? open('123.txt','r')
? ? print('-----test--2---')
except IOError:
? ? pass
說明:
·此程序看不到任何錯誤洞翩,因為用except捕獲到了IOError異常,并添加了處理的方法
·pass表示實現(xiàn)了相應的實現(xiàn)焰望,但什么也不做骚亿;如果把pass改為print語句,那么就會輸出其他信息
總結(jié):
注意: 把可能出現(xiàn)問題的代碼熊赖,放在try中
· ? ? ? ? ? 把處理異常的代碼来屠,放在except中
2.2,except捕獲多個異常
try:
? ? print('-----test--1---')
? ? open('123.txt','r')#如果123.txt文件不存在震鹉,那么會產(chǎn)生IOError異常
? ? print('-----test--2---')
? ? print(num)#如果num變量沒有定義俱笛,那么會產(chǎn)生NameError異常
except (IOError,NameError):
#如果想通過一次except捕獲到多個異常可以用一個元組的方式
#?errorMsg里會保存捕獲到的錯誤信息
print(errorMsg)
注意:
·當捕獲多個異常時传趾,可以把要捕獲的異常的名字迎膜,放到except后,并使用元組的方式僅進行存儲
2.3獲取異常的信息描述
2.4捕獲所有異常
3.else
? ? ? ?咱們應該對else并不陌生浆兰,在if中磕仅,它的作用是當條件不滿足時執(zhí)行的實行;同樣在try...except...中也是如此簸呈,即如果沒有捕獲到異常榕订,那么就執(zhí)行else中的事情
try:
? ? num?=?100
? ? print?num
except?Exception?as?ex:
? ? print('產(chǎn)生錯誤了:%s'%ex)
else:
? ? print('沒有捕獲到異常,真高興')
? ? print('over...')
4.try...finally...
try...finally...語句用來表達這樣的情況:
? ? ? 在程序中蜕便,如果一個段代碼必須要執(zhí)行劫恒,即無論異常是否產(chǎn)生都要執(zhí)行,那么此時就需要使用finally玩裙。?比如文件關(guān)閉兼贸,釋放鎖,把數(shù)據(jù)庫連接返還給連接池等
import time ?#導入時間模塊
try:
? ? f?=?open('test.txt')
try:
? ? ?whileTrue:
? ? ? ? ? content?=?f.readline()
? ? ? ? ? if ?len(content)?==0:
? ? ? ? ? ? ? ? ? ?break
? ? ? ? ? time.sleep(2)
? ? ? ? ? print(content)
except:
#如果在讀取文件的過程中吃溅,產(chǎn)生了異常溶诞,那么就會捕獲到
#比如?按下了ctrl+c
? ? ? ? ? pass
finally:
? ? ?f.close()
? ? ?print('關(guān)閉文件')
except:
? ? print("沒有這個文件")
說明:
test.txt文件中每一行數(shù)據(jù)打印,但是我有意在每打印一行之前用time.sleep方法暫停2秒鐘决侈。這樣做的原因是讓程序運行得慢一些螺垢。在程序運行的時候喧务,按Ctrl+c中斷(取消)程序。
我們可以觀察到KeyboardInterrupt異常被觸發(fā)枉圃,程序退出筑凫。但是在程序退出之前,finally從句仍然被執(zhí)行彼哼,把文件關(guān)閉顷牌。
5.函數(shù)嵌套調(diào)用中
def test1():
? ? print("----test1-1----")
? ? print(num)
? ? ?print("----test1-2----")
def test2():
? ? ?print("----test2-1----")
? ? ?test1()
? ? ?print("----test2-2----")
def test3():
try:
? ? print("----test3-1----")
? ? test1()
? ? print("----test3-2----")
exceptExceptionasresult:
? ? print("捕獲到了異常,信息是:%s"%result)
? ? print("----test3-2----")
? ? test3()
print("------華麗的分割線-----")
test2()
運行結(jié)果:
總結(jié):
· ? ?如果try嵌套返劲,那么如果里面的try沒有捕獲到這個異常玲昧,那么外面的try會接收到這個異常,然后進行處理篮绿,如果外邊的try依然沒有捕獲到孵延,那么再進行傳遞。亲配。尘应。
· ? ? 如果一個異常是在一個函數(shù)中產(chǎn)生的,例如函數(shù)A---->函數(shù)B---->函數(shù)C,而異常是在函數(shù)C中產(chǎn)生的吼虎,那么如果函數(shù)C中沒有對這個異常進行處理犬钢,那么這個異常會傳遞到函數(shù)B中,如果函數(shù)B有異常處理那么就會按照函數(shù)B的處理方式進行執(zhí)行鲸睛;如果函數(shù)B也沒有異常處理娜饵,那么這個異常會繼續(xù)傳遞,以此類推官辈。箱舞。。如果所有的函數(shù)都沒有處理拳亿,那么此時就會進行異常的默認處理晴股,即通常見到的那樣
· ? ? 注意觀察上圖中,當調(diào)用test3函數(shù)時肺魁,在test1函數(shù)內(nèi)部產(chǎn)生了異常电湘,此異常被傳遞到test3函數(shù)中完成了異常處理,而當異常處理完后鹅经,并沒有返回到函數(shù)test1中進行執(zhí)行寂呛,而是在函數(shù)test3中繼續(xù)執(zhí)行