首頁技術(shù)文章正文

Python為什么要捕獲異常?捕獲異常的方法和語法精講

更新時(shí)間:2023-10-20 來源:黑馬程序員 瀏覽量:

什么是異常

當(dāng)檢測到一個(gè)錯(cuò)誤時(shí),Python解釋器就無法繼續(xù)執(zhí)行了,反而出現(xiàn)了一些錯(cuò)誤的提示,這就是所謂的“異?!? 也就是我們常說的BUG。

早期計(jì)算機(jī)采用大量繼電器工作,馬克二型計(jì)算機(jī)就是這樣的。

1945年9月9日,下午三點(diǎn),馬克二型計(jì)算機(jī)無法正常工作了,技術(shù)人員試了很多辦法,最后定位到第70號繼電器出錯(cuò)。負(fù)責(zé)人哈珀觀察這個(gè)出錯(cuò)的繼電器,發(fā)現(xiàn)一只飛蛾躺在中間,已經(jīng)被繼電器打死。她小心地用攝子將蛾子夾出來,用透明膠布帖到“事件記錄本”中,并注明“第一個(gè)發(fā)現(xiàn)蟲子的實(shí)例。”自此之后,引發(fā)軟件失效的缺陷,便被稱為Bug。

1697785842772_bug.png

捕獲異常

世界上沒有完美的程序,任何程序在運(yùn)行的過程中,都有可能出現(xiàn):異常,也就是出現(xiàn)bug導(dǎo)致程序無法完美運(yùn)行下去。我們要做的,不是力求程序完美運(yùn)行。而是在力所能及的范圍內(nèi),對可能出現(xiàn)的bug,進(jìn)行提前準(zhǔn)備、提前處理。這種行為我們稱之為:異常處理(捕獲異常)

當(dāng)我們的程序遇到了BUG, 那么接下來有兩種情況:

① 整個(gè)程序因?yàn)橐粋€(gè)BUG停止運(yùn)行

② 對BUG進(jìn)行提醒, 整個(gè)程序繼續(xù)運(yùn)行

顯然在之前的學(xué)習(xí)中, 我們所有的程序遇到BUG就會出現(xiàn)①的這種情況, 也就是整個(gè)程序直接奔潰.

但是在真實(shí)工作中, 我們肯定不能因?yàn)橐粋€(gè)小的BUG就讓整個(gè)程序全部奔潰, 也就是我們希望的是達(dá)到② 的這種情況,那這里我們就需要使用到捕獲異常。

捕獲異常的作用在于:提前假設(shè)某處會出現(xiàn)異常,做好提前準(zhǔn)備,當(dāng)真的出現(xiàn)異常的時(shí)候,可以有后續(xù)手段。

捕獲常規(guī)異常的基本語法格式如下:

try:
    可能發(fā)生錯(cuò)誤的代碼
except:
    如果出現(xiàn)異常執(zhí)行的代碼

嘗試以`r`模式打開文件,如果文件不存在,則以`w`方式打開。

try:
    f = open('linux.txt', 'r')
except:
    f = open('linux.txt', 'w')

如果要捕獲指定異常,可以參考以下語法:

try:
    print(name)
except NameError as e:
    print('name變量名稱未定義錯(cuò)誤')

注意:

① 如果嘗試執(zhí)行的代碼的異常類型和要捕獲的異常類型不一致,則無法捕獲異常。

② 一般try下方只放一行嘗試執(zhí)行的代碼。

當(dāng)捕獲多個(gè)異常時(shí),可以把要捕獲的異常類型的名字,放到except 后,并使用元組的方式進(jìn)行書寫。

try:
    print(1/0)
except (NameError, ZeroDivisionError):
    print('ZeroDivision錯(cuò)誤...')

Python的執(zhí)行結(jié)果如下:
python異常

異常else

else表示的是如果沒有異常要執(zhí)行的代碼。

try:
    print(1)
except Exception as e:
    print(e)
else:
    print('我是else,是沒有異常的時(shí)候執(zhí)行的代碼

執(zhí)行結(jié)果:

1697786448332_執(zhí)行結(jié)果.png

異常的finally

finally表示的是無論是否異常都要執(zhí)行的代碼,例如關(guān)閉文件。

try:
    f = open('test.txt', 'r')
except Exception as e:
    f = open('test.txt', 'w')
else:
    print('沒有異常,真開心')
finally:
    f.close()


分享到:
在線咨詢 我要報(bào)名
和我們在線交談!