1. 程式人生 > 實用技巧 >太乾了!一張圖整理了 Python 所有內建異常

太乾了!一張圖整理了 Python 所有內建異常

在編寫程式時,可能會經常報出一些異常,很大一方面原因是自己的疏忽大意導致程式給出錯誤資訊,另一方面是因為有些異常是程式執行時不可避免的,比如在爬蟲時可能有幾個網頁的結構不一致,這時兩種結構的網頁用同一套程式碼就會出錯,所以我們就需要捕獲出現的異常,以防止程式因為錯誤資訊而終止執行。

Python有很多的內建異常,也就是說Python開發者提前考慮到了使用者程式設計過程中可能會出現這類錯誤,所以製造了這些內建異常可以快速準確向用戶反饋出錯資訊幫助找出程式碼中的bug。

下面針對幾個常見的異常單獨介紹一下,通過舉例深入瞭解在什麼條件下會觸發哪一種異常。

1、SyntaxError

SyntaxError主要是Python語法發生了錯誤,比如少個冒號、多個引號之類的,程式設計時稍微疏忽大意一下就會出錯,應該是最常見的一種異常錯誤了。

In[1]:WhileTrueprint('1')
File"<ipython-input-1-8ebf67bb4c2b>",line1
WhileTrueprint('1')
^
SyntaxError:invalidsyntax
複製程式碼

2、TypeError

TypeError是型別錯誤,也就是說將某個操作或功能應用於不合適型別的物件時引發,比如整型與字元型進行加減法、在兩個列表之間進行相減操作等等。

In[8]:a=[1,2];b=[2,3]
In[9]:a-b
---------------------------------------------------------------------------
TypeErrorTraceback(mostrecentcalllast)
<ipython-input-9-5ae0619f8fe1>in<module>
---->1a-b

TypeError:unsupportedoperandtype(s)for-:'list'and'list'
複製程式碼

3、IndexError

IndexError是指索引出現了錯誤,比如最常見下標索引超出了序列邊界,比如當某個序列m只有三個元素,卻試圖訪問m[4]。

In[16]:m=[1,2,3]
In[17]:m[4]
---------------------------------------------------------------------------
IndexErrorTraceback(mostrecentcalllast)
<ipython-input-17-94e0dfab3ff6>in<module>
---->1m[4]

IndexError:listindexoutofrange
複製程式碼

4、KeyError

KeyError是關鍵字錯誤,這個異常主要發生在字典中,比如當用戶試圖訪問一個字典中不存在的鍵時會被引發。

In[18]:dict_={'1':'yi','2':'er'}
In[19]:dict_['3']
---------------------------------------------------------------------------
KeyErrorTraceback(mostrecentcalllast)
<ipython-input-19-c2e43847635f>in<module>
---->1dict_['3']

KeyError:'3'
複製程式碼

5、ValueError

ValueError為值錯誤,當用戶傳入一個呼叫者不期望的值時會引發,即使這個值的型別是正確的,比如想獲取一個列表中某個不存在值的索引。

In[22]:n=[1,2,3]
In[23]:n.index(4)
---------------------------------------------------------------------------
ValueErrorTraceback(mostrecentcalllast)
<ipython-input-23-9a1887cf29d7>in<module>
---->1n.index(4)

ValueError:4isnotinlist
複製程式碼

6、AttributeError

AttributeError是屬性錯誤,當用戶試圖訪問一個物件不存在的屬性時會引發,比如列表有index方法,而字典卻沒有,所以對一個字典物件呼叫該方法就會引發該異常。

In[25]:dict_={'1':'yi','2':'er'}
In[26]:dict_.index('1')
---------------------------------------------------------------------------
AttributeErrorTraceback(mostrecentcalllast)
<ipython-input-26-516844ad2563>in<module>
---->1dict_.index('1')

AttributeError:'dict'objecthasnoattribute'index'
複製程式碼

7、NameError

NameError是指變數名稱發生錯誤,比如使用者試圖呼叫一個還未被賦值或初始化的變數時會被觸發。

In[27]:print(list_)
---------------------------------------------------------------------------
NameErrorTraceback(mostrecentcalllast)
<ipython-input-27-87ebf02ffcab>in<module>
---->1print(list_)

NameError:name'list_'isnotdefined
複製程式碼

8、FileNotFoundError

FileNotFoundError為開啟檔案錯誤,當用戶試圖以讀取方式開啟一個不存在的檔案時引發。

In[29]:fb=open('./list','r')
---------------------------------------------------------------------------
FileNotFoundErrorTraceback(mostrecentcalllast)
<ipython-input-29-1b65fe5400ea>in<module>
---->1fb=open('./list','r')

FileNotFoundError:[Errno2]Nosuchfileordirectory:'./list'
複製程式碼

9、StopIteration

StopIteration為迭代器錯誤,當訪問至迭代器最後一個值時仍然繼續訪問,就會引發這種異常,提醒使用者迭代器中已經沒有值可供訪問了。

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)
---------------------------------------------------------------------------
StopIterationTraceback(mostrecentcalllast)
<ipython-input-35-5a5a8526e73b>in<module>
---->1next(list2)
複製程式碼

10、AssertionError

AssertionError為斷言錯誤,當用戶利用斷言語句檢測異常時,如果斷言語句檢測的表示式為假,則會引發這種異常。

In[45]:list3=[1,2]

In[46]:assertlen(list3)>2
---------------------------------------------------------------------------
AssertionErrorTraceback(mostrecentcalllast)
<ipython-input-46-ffd051e2ba94>in<module>
---->1assertlen(list3)>2

AssertionError:
複製程式碼

上面這些異常應該是平時程式設計中遇見頻率比較高的一部分,完整的還是要看上文的思維導圖或者查閱官方文件,當然除此之外Python也支援使用者根據自己的需求自定義異常,這裡就不再過多概述了。

對於異常的處理Python也有著比較強大的功能,比如可以捕獲異常,主動丟擲異常等等,主要有下面幾種方式:

  • 1.try ... except 結構語句捕獲
  • 2.try ... except ... finally 結構語句捕獲
  • 3.try ... except ... else 結構語句捕獲
  • 4.raise關鍵字主動丟擲異常
  • 5.try ... raise ... except 觸發異常
  • 6.assert斷言語句
  • 7.traceback模組跟蹤檢視異常

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯絡我們以作處理

想要獲取更多Python學習資料可以加QQ:2955637827私聊或加Q群630390733大家一起來學習討論吧!