一圖流:Python所有內(nèi)置異常
大家好,歡迎來到Crossin的編程教室!
在編寫程序時,可能會經(jīng)常報出一些異常,很大一方面原因是自己的疏忽大意導(dǎo)致程序給出錯誤信息,另一方面是因?yàn)橛行┊惓J浅绦蜻\(yùn)行時不可避免的,比如在爬蟲時可能有幾個網(wǎng)頁的結(jié)構(gòu)不一致,這時兩種結(jié)構(gòu)的網(wǎng)頁用同一套代碼就會出錯,所以我們就需要捕獲出現(xiàn)的異常,以防止程序因?yàn)殄e誤信息而終止運(yùn)行。
Python有很多的內(nèi)置異常,也就是說Python開發(fā)者提前考慮到了用戶編程過程中可能會出現(xiàn)這類錯誤,所以制造了這些內(nèi)置異??梢钥焖贉?zhǔn)確向用戶反饋出錯信息幫助找出代碼中的bug。
Python官方文檔中也給出了所有內(nèi)置異常及觸發(fā)條件,為了更好的閱讀體驗(yàn),我把所有異常及觸發(fā)條件整理成了一張思維導(dǎo)圖(點(diǎn)擊放大,橫屏查看):

1、SyntaxError
SyntaxError主要是Python語法發(fā)生了錯誤,比如少個冒號、多個引號之類的,編程時稍微疏忽大意一下就會出錯,應(yīng)該是最常見的一種異常錯誤了。
In?[1]:?While?True?print('1')
??File?"" ,?line?1
????While?True?print('1')
??????????^
SyntaxError:?invalid?syntax
2、TypeError
TypeError是類型錯誤,也就是說將某個操作或功能應(yīng)用于不合適類型的對象時引發(fā),比如整型與字符型進(jìn)行加減法、在兩個列表之間進(jìn)行相減操作等等。
In?[8]:?a?=?[1,2];b?=?[2,3]
In?[9]:?a-b
---------------------------------------------------------------------------
TypeError?????????????????????????????????Traceback?(most?recent?call?last)-9-5ae0619f8fe1>?in?
---->?1?a-b
TypeError:?unsupported?operand?type(s)?for?-:?'list'?and?'list'
3、IndexError
IndexError是指索引出現(xiàn)了錯誤,比如最常見下標(biāo)索引超出了序列邊界,比如當(dāng)某個序列m只有三個元素,卻試圖訪問m[4]。
In?[16]:?m?=?[1,2,3]
In?[17]:?m[4]
---------------------------------------------------------------------------
IndexError????????????????????????????????Traceback?(most?recent?call?last)-17-94e0dfab3ff6>?in?
---->?1?m[4]
IndexError:?list?index?out?of?range
4、KeyError
KeyError是關(guān)鍵字錯誤,這個異常主要發(fā)生在字典中,比如當(dāng)用戶試圖訪問一個字典中不存在的鍵時會被引發(fā)。
In?[18]:?dict_?=?{'1':'yi','2':'er'}
In?[19]:?dict_['3']
---------------------------------------------------------------------------
KeyError??????????????????????????????????Traceback?(most?recent?call?last)-19-c2e43847635f>?in?
---->?1?dict_['3']
KeyError:?'3'
5、ValueError
ValueError為值錯誤,當(dāng)用戶傳入一個調(diào)用者不期望的值時會引發(fā),即使這個值的類型是正確的,比如想獲取一個列表中某個不存在值的索引。
In?[22]:?n?=?[1,2,3]
In?[23]:?n.index(4)
---------------------------------------------------------------------------
ValueError????????????????????????????????Traceback?(most?recent?call?last)-23-9a1887cf29d7>?in?
---->?1?n.index(4)
ValueError:?4?is?not?in?list
6、AttributeError
AttributeError是屬性錯誤,當(dāng)用戶試圖訪問一個對象不存在的屬性時會引發(fā),比如列表有index方法,而字典卻沒有,所以對一個字典對象調(diào)用該方法就會引發(fā)該異常。
In?[25]:?dict_?=?{'1':'yi','2':'er'}
In?[26]:?dict_.index('1')
---------------------------------------------------------------------------
AttributeError????????????????????????????Traceback?(most?recent?call?last)-26-516844ad2563>?in?
---->?1?dict_.index('1')
AttributeError:?'dict'?object?has?no?attribute?'index'
7、NameError
NameError是指變量名稱發(fā)生錯誤,比如用戶試圖調(diào)用一個還未被賦值或初始化的變量時會被觸發(fā)。
In?[27]:?print(list_)
---------------------------------------------------------------------------
NameError?????????????????????????????????Traceback?(most?recent?call?last)-27-87ebf02ffcab>?in?
---->?1?print(list_)
NameError:?name?'list_'?is?not?defined
8、FileNotFoundError
FileNotFoundError為打開文件錯誤,當(dāng)用戶試圖以讀取方式打開一個不存在的文件時引發(fā)。
In?[29]:?fb?=?open('./list','r')
---------------------------------------------------------------------------
FileNotFoundError?????????????????????????Traceback?(most?recent?call?last)-29-1b65fe5400ea>?in?
---->?1?fb?=?open('./list','r')
FileNotFoundError:?[Errno?2]?No?such?file?or?directory:?'./list'
9、StopIteration
StopIteration為迭代器錯誤,當(dāng)訪問至迭代器最后一個值時仍然繼續(xù)訪問,就會引發(fā)這種異常,提醒用戶迭代器中已經(jīng)沒有值可供訪問了。
In?[30]:?list1?=?[1,2]
In?[31]:?list2?=?iter(list1)
In?[33]:?next(list2)
Out[33]:?1
In?[34]:?next(list2)
Out[34]:?2
In?[35]:?next(list2)
---------------------------------------------------------------------------
StopIteration?????????????????????????????Traceback?(most?recent?call?last)-35-5a5a8526e73b>?in?
---->?1?next(list2)
10、AssertionError
AssertionError為斷言錯誤,當(dāng)用戶利用斷言語句檢測異常時,如果斷言語句檢測的表達(dá)式為假,則會引發(fā)這種異常。
In?[45]:?list3?=?[1,2]
In?[46]:?assert?len(list3)>2
---------------------------------------------------------------------------
AssertionError????????????????????????????Traceback?(most?recent?call?last)-46-ffd051e2ba94>?in?
---->?1?assert?len(list3)>2
AssertionError:
上面這些異常應(yīng)該是平時編程中遇見頻率比較高的一部分,更多類型的異??蓞⒖忌衔牡乃季S導(dǎo)圖或者查閱官方文檔。當(dāng)然除此之外Python也支持用戶根據(jù)自己的需求自定義異常。
對于異常的處理Python也有著比較強(qiáng)大的功能,比如可以捕獲異常,主動拋出異常等等,主要有下面幾種方式:
1.try ... except 結(jié)構(gòu)語句捕獲 2.try ... except ... finally 結(jié)構(gòu)語句捕獲 3.try ... except ... else 結(jié)構(gòu)語句捕獲 4.raise關(guān)鍵字主動拋出異常 5.try ... raise ... except 觸發(fā)異常 6.assert斷言語句 7.traceback模塊跟蹤查看異常
本文的思維導(dǎo)圖我是用百度腦圖繪制的,我也放在了網(wǎng)盤里,你可以自己在上面做補(bǔ)充和修改。
思維導(dǎo)圖下載:
https://pan.baidu.com/s/1X4NIoRec1umU6Dhh9GobQQ
提取碼:tcwy
官方文檔:
https://docs.python.org/3/library/exceptions.html#base-classes
作者:奶糖貓
來源:喵說Python
_往期文章推薦_
