Python錯(cuò)誤和異??偨Y(jié)詳細(xì)
寫Python代碼的小伙伴不可避免地會遇到代碼執(zhí)行錯(cuò)誤和異常,這次就來詳細(xì)且不失通俗地總結(jié)一下python中的錯(cuò)誤和異常。
先拋出兩個(gè)問題:
- 什么是Python錯(cuò)誤和異常?
- 如何處理Python錯(cuò)誤和異常?
1、語法錯(cuò)誤
語法錯(cuò)誤可能是初學(xué)者最常遇到的,如下面熟悉的畫面:
SyntaxError: invalid syntax
語法錯(cuò)誤又稱解析錯(cuò)誤,又有老哥會問什么是解析錯(cuò)誤?簡單來說是基本語法結(jié)構(gòu)寫錯(cuò)了,如:多任務(wù)寫成一行、for循環(huán)沒加‘:'等。如下:
多任務(wù)寫成一行
for循環(huán)沒加‘:'
上面示例可以看到,針對語法錯(cuò)誤,python
解析器會輸出錯(cuò)誤的那一行,并且在最先找到的錯(cuò)誤的位置標(biāo)記了一個(gè)箭頭。
2、異常
熟悉pytho
n語法后,可以避免語法錯(cuò)誤,但是代碼常會發(fā)生異常(Exception)。還是兩個(gè)問題:
異常是什么?
Python
用異常對象(exception object
)來表示異常情況。
遇到錯(cuò)誤后,會引發(fā)異常。如果異常對象并未被處理或捕捉,程序就會用所謂的回溯(traceback
, 一種錯(cuò)誤信息)終止執(zhí)行。
異常和語法錯(cuò)誤有什么區(qū)別呢?
錯(cuò)誤:是指代碼不符合解釋器或者編譯器語法
異常:是指不完整、不合法輸入,或者計(jì)算出現(xiàn)錯(cuò)誤
關(guān)于異常,舉個(gè)例子:
Print('hello world')
這行代碼出現(xiàn)異常,因?yàn)?code>Print的p應(yīng)該小寫:
python
拋出異常類型:NameError
,即名字錯(cuò)誤。
其它異常的例子:
可以看到,異常有不同的類型,發(fā)生異常后,其類型名稱會被打印出來。上述這些都是python
內(nèi)置的異常,用戶也可以自定義異常,這里不做贅述。
3、try...except...語句
有python編程經(jīng)驗(yàn)的人會知道,python
里用try...except...
語句來處理異常情況。
先看個(gè)異常處理的示例:
看,我們完美地捕捉到了程序中的異常。
結(jié)合上面的示例,處理異常的規(guī)則是:把執(zhí)行的語句放在 try 代碼塊中,將錯(cuò)誤處理器代碼放置在 except
代碼塊中,except
會引發(fā)ZeroDivisionErro
r異常來提醒Coder
,這段代碼的錯(cuò)誤是零不能作為被除數(shù)。
except
后面也可以不添加異常類型,會捕獲所有出現(xiàn)的異常:
我們可以把try...except...
原理歸納為幾個(gè)要點(diǎn):
- 首先,執(zhí)行 try 子句 (try 和
except
關(guān)鍵字之間的(多行)語句) - 如果沒有異常發(fā)生,則跳過
except
子句 并完成 try 語句的執(zhí)行 - 如果在執(zhí)行try 子句時(shí)發(fā)生了異常,則跳過該子句中剩下的部分。然后,如果異常的類型和
except
關(guān)鍵字后面的異常匹配,則執(zhí)行except
子句 ,然后繼續(xù)執(zhí)行 try 語句之后的代碼 - 如果發(fā)生的異常和
except
子句中指定的異常不匹配,則將其傳遞到外部的 try 語句中;如果沒有找到處理程序,則它是一個(gè) 未處理異常,執(zhí)行將停止并顯示如上所示的消息
4、多個(gè)except子句
上面的try...except...
語句只處理了一種異常,如果我想多匹配幾個(gè)異常類型,怎么辦呢?
這里就需要多個(gè)except子句來幫忙了,舉個(gè)例子:
引發(fā)異常ZeroDivisionError
引發(fā)異常TypeError
上面我們用了兩個(gè)except
,匹配ZeroDivisionError
和TypeError
這兩種異常,第一個(gè)代碼捕捉到了ZeroDivisionError
,第二段代碼捕捉到了TypeError異常,一個(gè)都沒有漏。
當(dāng)然你還可以這樣寫:
也就是用一個(gè)except
捕捉多個(gè)異常,異常類型放到except后面的元組里。
綜上,對于多個(gè)except
子句,可以總結(jié)為:
- 一個(gè) try 語句可能有多個(gè)
except
子句,以指定不同異常的處理程序 - 最多會執(zhí)行一個(gè)處理程序
- 處理程序只處理相應(yīng)的 try 子句中發(fā)生的異常,而不處理同一 try 語句內(nèi)其他處理程序中的異常
- 一個(gè)
except
子句可以將多個(gè)異常命名為帶括號的元組
5、try...except Exception as e語句
我們常常會看看這樣的寫法:try...except Exception as e
其中的e代表什么意思呢?
再舉個(gè)例子:
通過示例可以知道,e輸出了異常類型。
也就是說,Exception
匹配了所有異常,把異常名稱賦給了e。當(dāng)然這里不一定非得是e,你可以取任何的變量名,只是約定俗稱這樣寫罷了。
6、try...except...finally語句
try...except...finally
語句可能并不那么常見,但它是非常有用的。
如果說,我想用python
打開了一個(gè)txt文件,然后讀取,寫入,最后關(guān)閉文件對象。這是一套常規(guī)流程,如果我想捕捉代碼過程中的異常,又要保證無論是否有異常,最后都必須要關(guān)閉文件。這時(shí)候就用到finally
,看下面例子:
上面代碼,既捕捉到了異常,最終又關(guān)閉了文件對象。finaly
的作用是,無論except
是否捕捉到異常,finally后面的代碼都會執(zhí)行,try獲取了資源,finally
釋放資源,保證了收尾工作。
7、with...語句
with...
語句相當(dāng)于try-finally
語句的簡寫,可以替代try-finally
的功能。
表達(dá)式open('poem.txt')
返回是一個(gè)_io.TextIOWrapper
類型的變量賦給f。在with
語句塊中就可以使用這個(gè)變量操作文件。執(zhí)行with這個(gè)結(jié)構(gòu)之后,f會自動(dòng)關(guān)閉,相當(dāng)于自帶了一個(gè)finally
。
到此這篇關(guān)于Python錯(cuò)誤和異??偨Y(jié)詳細(xì)的文章就介紹到這了,更多相關(guān)Python錯(cuò)誤和異常內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。