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