更新時(shí)間:2023-10-20 來(lái)源:黑馬程序員 瀏覽量:
當(dāng)檢測(cè)到一個(gè)錯(cuò)誤時(shí),Python解釋器就無(wú)法繼續(xù)執(zhí)行了,反而出現(xiàn)了一些錯(cuò)誤的提示,這就是所謂的“異?!? 也就是我們常說(shuō)的BUG。
早期計(jì)算機(jī)采用大量繼電器工作,馬克二型計(jì)算機(jī)就是這樣的。
1945年9月9日,下午三點(diǎn),馬克二型計(jì)算機(jī)無(wú)法正常工作了,技術(shù)人員試了很多辦法,最后定位到第70號(hào)繼電器出錯(cuò)。負(fù)責(zé)人哈珀觀察這個(gè)出錯(cuò)的繼電器,發(fā)現(xiàn)一只飛蛾躺在中間,已經(jīng)被繼電器打死。她小心地用攝子將蛾子夾出來(lái),用透明膠布帖到“事件記錄本”中,并注明“第一個(gè)發(fā)現(xiàn)蟲(chóng)子的實(shí)例?!弊源酥螅l(fā)軟件失效的缺陷,便被稱(chēng)為Bug。
世界上沒(méi)有完美的程序,任何程序在運(yùn)行的過(guò)程中,都有可能出現(xiàn):異常,也就是出現(xiàn)bug導(dǎo)致程序無(wú)法完美運(yùn)行下去。我們要做的,不是力求程序完美運(yùn)行。而是在力所能及的范圍內(nèi),對(duì)可能出現(xiàn)的bug,進(jìn)行提前準(zhǔn)備、提前處理。這種行為我們稱(chēng)之為:異常處理(捕獲異常)
當(dāng)我們的程序遇到了BUG, 那么接下來(lái)有兩種情況:
① 整個(gè)程序因?yàn)橐粋€(gè)BUG停止運(yùn)行
② 對(duì)BUG進(jìn)行提醒, 整個(gè)程序繼續(xù)運(yùn)行
顯然在之前的學(xué)習(xí)中, 我們所有的程序遇到BUG就會(huì)出現(xiàn)①的這種情況, 也就是整個(gè)程序直接奔潰.
但是在真實(shí)工作中, 我們肯定不能因?yàn)橐粋€(gè)小的BUG就讓整個(gè)程序全部奔潰, 也就是我們希望的是達(dá)到② 的這種情況,那這里我們就需要使用到捕獲異常。
捕獲異常的作用在于:提前假設(shè)某處會(huì)出現(xiàn)異常,做好提前準(zhǔn)備,當(dāng)真的出現(xiàn)異常的時(shí)候,可以有后續(xù)手段。
捕獲常規(guī)異常的基本語(yǔ)法格式如下:
try: 可能發(fā)生錯(cuò)誤的代碼 except: 如果出現(xiàn)異常執(zhí)行的代碼
嘗試以`r`模式打開(kāi)文件,如果文件不存在,則以`w`方式打開(kāi)。
try: f = open('linux.txt', 'r') except: f = open('linux.txt', 'w')
如果要捕獲指定異常,可以參考以下語(yǔ)法:
try: print(name) except NameError as e: print('name變量名稱(chēng)未定義錯(cuò)誤')
注意:
① 如果嘗試執(zhí)行的代碼的異常類(lèi)型和要捕獲的異常類(lèi)型不一致,則無(wú)法捕獲異常。
② 一般try下方只放一行嘗試執(zhí)行的代碼。
當(dāng)捕獲多個(gè)異常時(shí),可以把要捕獲的異常類(lèi)型的名字,放到except 后,并使用元組的方式進(jìn)行書(shū)寫(xiě)。
try: print(1/0) except (NameError, ZeroDivisionError): print('ZeroDivision錯(cuò)誤...')
Python的執(zhí)行結(jié)果如下:
else表示的是如果沒(méi)有異常要執(zhí)行的代碼。
try: print(1) except Exception as e: print(e) else: print('我是else,是沒(méi)有異常的時(shí)候執(zhí)行的代碼
執(zhí)行結(jié)果:
finally表示的是無(wú)論是否異常都要執(zhí)行的代碼,例如關(guān)閉文件。
try: f = open('test.txt', 'r') except Exception as e: f = open('test.txt', 'w') else: print('沒(méi)有異常,真開(kāi)心') finally: f.close()