python中,至少有兩種可區(qū)分的錯誤:語法錯誤(syntax error)和異常(exceptions)
目錄
語法錯誤(syntax error)
語法錯誤(syntax error)又稱為解析錯誤(parsing error)
因?yàn)閜ython是一種腳本,沒有python編譯器這種說法,只有python解釋器
所以python不存在編譯錯誤,只有解析錯誤
出現(xiàn)語法錯誤時(shí),python解釋器會輸出出現(xiàn)錯誤的行
并顯示一個(gè)小箭頭,指向行中最早出現(xiàn)錯誤的點(diǎn)
就像這樣
異常(exception)
即便語句或表達(dá)式在語法上是正確的
然而當(dāng)嘗試執(zhí)行腳本時(shí),同樣可能會引起錯誤,這種錯誤就是異常(exceptions)
當(dāng)然,這些異常并非在所有情況下都是致命的
異常分很多種類,python解釋器會輸出內(nèi)置異常的名稱給我們做參考
異常的分類可以參見以下官方文檔:
https://docs.python.org/2/library/exceptions.html#bltin-exceptions
處理異常
和java類似,python中我們可以實(shí)現(xiàn)處理我們自己選定的異常,例如:
運(yùn)行結(jié)果如下,當(dāng)輸入的是int類型的數(shù)據(jù)時(shí),break跳出while,運(yùn)行成功
當(dāng)輸入的是非int類型時(shí),程序會不斷提示你,直到你輸入正確的類型(當(dāng)然我們可以用ctrl+C中斷運(yùn)行)
實(shí)際上,用戶輸入ctrl+C中斷程序的運(yùn)行
其本質(zhì)上也是昌盛了一種異常,也就是?KeyboardInterrupt 異常
當(dāng)我們處理異常時(shí):
- try和except之間的語句被執(zhí)行
- 若沒有異常發(fā)生,except語句將不被執(zhí)行
- 若try和except之間的語句被執(zhí)行時(shí)發(fā)生了異常,則該部分剩下的語句不再被執(zhí)行,若except捕捉到了異常的類型,則直接跳轉(zhuǎn)去執(zhí)行except的語句,然后繼續(xù)執(zhí)行try和except之間剩下的語句
- 若try和except之間的語句被執(zhí)行時(shí)發(fā)生了異常,則該部分剩下的語句不再被執(zhí)行,若except沒有捕捉到了異常的類型,那么這就是一個(gè)未被處理的異常(Unhandled exception),程序運(yùn)行被終止
一個(gè)try后面可以跟著多個(gè)except語句
用于指定處理不同類型的異常
但是只有一個(gè)exception中的語句會被執(zhí)行
一個(gè)exception也可以處理多種異常,我們可以用元組來完成(用圓括號,這個(gè)不能漏掉),例如:
有的朋友們寫程序時(shí),喜歡在最后會加上一個(gè)省略異常名稱的except字句,作為通配符使用
當(dāng)然這也寫時(shí)要特別小心,因?yàn)檫@也寫可能會掩蓋程序真正的異常所在,最好在后面把異常raise回去,就像這樣:
當(dāng)出現(xiàn)I/Oerror時(shí):
若出現(xiàn)ValueError時(shí):
我們把程序稍微修改一下
此時(shí),就會執(zhí)行第3個(gè)except中的語句
其他
在except語句中,我們還可以在異常的后面指定變量
變量與異常的instance綁定(捕獲的異常也是對象)參數(shù)存儲在instance.args中
此外,我們還可以自己定義異常,這些高級的用法本文先不提了
本文摘自 :https://blog.51cto.com/u