python 異常種類速查
轉自:https://www.cnblogs.com/zhangjiansheng/p/6816983.html
因為開發中經常要遇到處理各種異常的情況,因此在這裡記一下python中的各種異常以備以後速查使用:
基本寫法
try:
print 'try...'
r = 10 / 0
print 'result:', r
except ZeroDivisionError, e:
print 'except:', e
finally:
print 'finally...'
print 'END'
使用try...except
捕獲錯誤可以跨越多層呼叫,比如函式main()
foo()
,foo()
呼叫bar()
,結果bar()
出錯了,這時,只要main()
捕獲到了,就可以處理,不需要像java那樣每層函式都要throw一下異常 ,只要在合適的層次去捕獲錯誤就可以了:
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except StandardError, e:
print 'Error!'
finally:
print 'finally...'
異常應該是類物件。模組中定義了例外 exceptions
。此模組不需要顯式匯入:異常在內建名稱空間以及 exceptions
模組中提供。
對於類異常,在try
同一個宣告中except
說提到的一類特殊條款,該條款還處理來自類(從中但也不例外類派生的任何異常類它派生)。通過子類化不相關的兩個異常類永遠不是等效的,即使它們具有相同的名稱。
下面列出的內建異常可以由直譯器或內建函式生成。除了提及的地方,他們有一個“關聯值”,指示錯誤的詳細原因。這可能是包含幾個資訊項的字串或元組(例如,錯誤程式碼和解釋程式碼的字串)。關聯值是語句的第二個引數 raise
BaseException
,則相關聯的值將作為異常例項的args
屬性存在。
使用者程式碼可以引發內建異常。這可以用於測試異常處理程式或報告錯誤條件“就像”直譯器引發相同異常的情況; 但請注意,沒有任何可以防止使用者程式碼提出不正確的錯誤。
內建的異常類可以被子類化以定義新的異常; 鼓勵程式設計師從Exception
類或其子類之一匯出新的異常,而不是從BaseException
。有關定義異常的更多資訊,請參見Python教程中 使用者定義的異常。
以下異常僅用作其他異常的基類。
異常BaseException
所有內建異常的基類。它不是直接由使用者定義的類繼承(為此使用Exception
)。如果 str()
或者unicode()
是在這個類的一個例項上被呼叫,返回例項的引數表示,或者當沒有引數時,返回空字串。
args
給異常建構函式的元組元組。一些內建異常(如IOError
)期望一定數量的引數,併為此元組的元素分配特殊含義,而其他異常通常僅使用單個字串給出錯誤訊息。
異常Exception
所有內建的,非系統退出的異常都是從這個類派生出來的。所有使用者定義的異常也應該從此類派生。
更改版本2.5:更改為繼承BaseException
。
異常StandardError
該基類除了所有內建例外StopIteration
, GeneratorExit
,KeyboardInterrupt
和SystemExit
。 StandardError
本身源於Exception
。
異常ArithmeticError
對於那些內建異常的基類時引發的各種算術錯誤:OverflowError
,ZeroDivisionError
, FloatingPointError
。
異常BufferError
當無法執行緩衝區相關操作時引發。
異常LookupError
當對映或序列上使用的鍵或索引無效時引發異常的基類:IndexError
,KeyError
。這可以直接提出來codecs.lookup()
。
異常EnvironmentError
對於可以在Python的系統外發生異常的基類: IOError
,OSError
。當使用2元組建立此型別的異常時,第一個專案在例項的errno
屬性上可用(假設為錯誤號),第二個專案在屬性上 strerror
可用(通常是關聯的錯誤訊息)。元組本身也可以在屬性上使用args
。
新版本1.5.2。
當使用EnvironmentError
3元組例項化異常時,前兩個專案如上所述,而第三個專案在該filename
屬性上 可用。但是,為了向後相容,該 args
屬性僅包含前兩個建構函式引數的2元組。
該filename
屬性是None
使用3個引數以外的其他異常建立的。的errno
和strerror
屬性也None
當例項與其他大於2個或3個引數建立。在最後一種情況下,args
將逐個建構函式的引數包含為元組。
以下異常是實際引發的異常。
異常AssertionError
當assert
宣告失敗時提起。
異常AttributeError
屬性引用(請參閱屬性引用)或賦值失敗時引發。(當一個物件根本不支援屬性引用或屬性賦值時,TypeError
會被提出。)
異常EOFError
當其中一個內建函式(input()
或raw_input()
)在沒有讀取任何資料的情況下觸發檔案結束條件(EOF)時引發。(注:在 file.read()
和file.readline()
方法時,他們打EOF返回一個空字串。)
異常FloatingPointError
當浮點操作失敗時觸發。這個異常總是定義的,但是隻有當Python配置了該--with-fpectl
選項,或者WANT_SIGFPE_HANDLER
在pyconfig.h
檔案中定義了符號時,才能引發此異常 。
異常GeneratorExit
當發電機的close()
方法被呼叫時提起。它直接繼承BaseException
而不是,StandardError
因為它在技術上不是錯誤。
在版本2.6中更改:更改為繼承BaseException
。
異常IOError
當I / O操作(如print
語句,內建 open()
函式或檔案物件的方法)因I / O相關原因(例如“未找到檔案”或“磁碟已滿”)而失敗時引發。
此類衍生EnvironmentError
。有關異常例項屬性的更多資訊,請參閱上面的討論。
在版本2.6中更改:更改socket.error
為使用此作為基類。
異常ImportError
當import
語句找不到模組定義或找不到要匯入的名稱時引發。from ... import
異常IndexError
當序列下標超出範圍時提起。(Slice索引被靜默地截斷以落在允許的範圍內;如果索引不是一個純整數, TypeError
則會被提升。)
異常KeyError
當在現有金鑰集中找不到對映(字典)鍵時引發。
異常KeyboardInterrupt
當用戶點選中斷鍵(正常Control-C
或 Delete
)時觸發。在執行期間,定期檢查中斷。當內建函式input()
或raw_input()
正在等待輸入時,鍵入的中斷也會引發此異常。異常繼承 BaseException
而不被意外地捕獲 Exception
並因此阻止直譯器退出的程式碼。
更改版本2.5:更改為繼承BaseException
。
異常MemoryError
當操作記憶體不足時提起,但情況可能仍然會被搶救(通過刪除某些物件)。相關聯的值是一個字串,指示什麼樣的(內部)操作用完了記憶體。請注意,由於底層記憶體管理架構(C的malloc()
功能),直譯器可能並不總是能夠從這種情況中完全恢復; 但是它引發了一個異常,以便可以列印堆疊跟蹤,以防萬一出現程式的原因。
異常NameError
當找不到本地或全球名稱時提起。這僅適用於不合格的名稱。相關聯的值是一個錯誤訊息,其中包含無法找到的名稱。
異常NotImplementedError
這個異常來源於RuntimeError
。在使用者定義的基類中,當需要派生類來覆蓋該方法時,抽象方法應引發此異常。
異常OSError
這個異常來源於EnvironmentError
。當函式返回與系統相關的錯誤(不是非法引數型別或其他偶然錯誤)時引發。的errno
屬性是從一個數字錯誤程式碼errno
,並且strerror
屬性是相應的字串,如將被C函式被列印perror()
。請參閱模組errno
,其中包含由底層作業系統定義的錯誤程式碼的名稱。
對於涉及檔案系統路徑(例如chdir()
或 unlink()
)的異常,異常例項將包含第三個屬性 filename
,即傳遞給該函式的檔名。
新版本1.5.2。
異常OverflowError
當算術運算的結果太大而不能被表示時提升。對於長整型(這不會 MemoryError
放棄)而且對於大多數具有純整數的操作,這不會返回長整數。由於在C中缺少浮點異常處理的標準化,大多數浮點運算也沒有被檢查。
異常ReferenceError
當由weakref.proxy()
函式建立的弱引用代理 在垃圾回收之後用於訪問指稱物件的屬性時,會引發此異常。有關弱引用的更多資訊,請參閱該weakref
模組。
2.2版中的新功能:以前被稱為weakref.ReferenceError
異常。
異常RuntimeError
當檢測到不屬於任何其他類別的錯誤時引發。相關聯的值是一個字串,表示正確的錯誤。
異常StopIteration
由迭代器的next()
方法引發,表明沒有其他值。這是從而Exception
不是StandardError
,因為這不被認為是其正常應用程式中的錯誤。
版本2.2中新增。
異常SyntaxError
解析器遇到語法錯誤時引發。這可能發生在 import
語句,exec
語句,呼叫內建函式eval()
或input()
讀取初始指令碼或標準輸入(也可互動式)時。
這個類的例項有屬性filename
,lineno
, offset
並且text
為的細節更容易獲得。 str()
的異常例項僅返回訊息。
異常IndentationError
與錯誤縮排相關的語法錯誤的基類。這是一個子類SyntaxError
。
異常TabError
縮排時引發的標籤和空格不一致。這是一個子類IndentationError
。
異常SystemError
當翻譯發現內部錯誤時,提出了這種情況,但情況並不那麼嚴重,導致它放棄了所有的希望。相關聯的值是一個字串,表示出現錯誤(低級別)。
您應該向Python直譯器的作者或維護者報告。確保報告Python直譯器的版本(sys.version
它也是在互動式Python會話開始時列印的),確切的錯誤訊息(異常關聯值)以及觸發錯誤的程式源可能的可能。
異常SystemExit
該異常由sys.exit()
函式引發。當它不被處理時,Python直譯器退出; 不列印堆疊追溯。如果關聯值為純整數,則指定系統退出狀態(傳遞給C的exit()
函式); 如果是None
,退出狀態為零; 如果有其他型別(如字串),則列印物件的值,退出狀態為一。
例項具有code
設定為建議的退出狀態或錯誤訊息(預設為None
)的屬性。此外,這種異常直接來自於BaseException
而不是StandardError
,因為它在技術上不是錯誤。
呼叫sys.exit()
被轉換為異常,以便清理處理程式(finally
語句的try
子句)可以被執行,並且偵錯程式可以執行指令碼而不會失去控制的風險。os._exit()
如果絕對有必要立即退出(例如,在呼叫後的子程序os.fork()
)中,則可以使用該函式。
唯一的例外來自繼承BaseException
,而不是StandardError
或Exception
使得它不會意外地被映入程式碼捕獲 Exception
。這允許異常正常傳播並導致直譯器退出。
更改版本2.5:更改為繼承BaseException
。
異常TypeError
當操作或功能應用於不適當型別的物件時提起。關聯值是一個字串,提供有關型別不匹配的詳細資訊。
異常UnboundLocalError
當引用函式或方法中的區域性變數時引用,但沒有值繫結到該變數。這是一個子類 NameError
。
異常UnicodeError
當與Unicode相關的編碼或解碼錯誤發生時引發。它是一個子類ValueError
。
UnicodeError
具有描述編碼或解碼錯誤的屬性。例如,err.object[err.start:err.end]
給出編解碼器失敗的特定無效輸入。
encoding
引起錯誤的編碼的名稱。
reason
描述特定編解碼器錯誤的字串。
object
編解碼器正在嘗試編碼或解碼的物件。
start
第一個無效資料索引object
。
end
上次無效資料後的索引object
。
異常UnicodeEncodeError
在編碼期間發生Unicode相關錯誤時引發。它是一個子類 UnicodeError
。
異常UnicodeDecodeError
在解碼過程中發生Unicode相關錯誤時引發。它是一個子類 UnicodeError
。
異常UnicodeTranslateError
在翻譯期間發生Unicode相關錯誤時引發。它是一個子類UnicodeError
。
異常ValueError
當內建操作或函式接收到具有正確型別但不正確值的引數時引發,並且情況未被更精確的異常描述,例如IndexError
。
異常VMSError
僅適用於VMS。發生VMS特定錯誤時引發。
異常WindowsError
當出現特定於Windows的錯誤或錯誤號不對應於某個errno
值時引發。該winerror
和 strerror
值是從的返回值建立 GetLastError()
並FormatMessage()
從Windows平臺的API函式。該errno
值將值對映winerror
到相應的errno.h
值。這是一個子類OSError
。
版本2.5更改:以前的版本將GetLastError()
程式碼放入errno
。
異常ZeroDivisionError
當分割或模運算的第二個引數為零時提升。關聯值是指示運算元的型別和操作的字串。
以下例外被用作警告類別; warnings
有關詳細資訊,請參閱該模組。
異常Warning
警告類別的基類。
異常UserWarning
由使用者程式碼生成的警告的基類。
異常DeprecationWarning
關於已棄用功能的警告的基類。
異常PendingDeprecationWarning
關於將來不推薦使用的功能的警告的基類。
異常SyntaxWarning
關於可疑語法的警告的基類。
異常RuntimeWarning
關於可疑執行時行為的警告的基類。
異常FutureWarning
關於將來會在語義上改變的結構的警告的基類。
異常ImportWarning
關於模組進口中可能出現的錯誤的警告的基礎類。
異常UnicodeWarning
與Unicode有關的警告的基類。
異常層次
內建異常的類層次結構為:
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StandardError
| +-- BufferError
| +-- ArithmeticError
| | +-- FloatingPointError
| | +-- OverflowError
| | +-- ZeroDivisionError
| +-- AssertionError
| +-- AttributeError
| +-- EnvironmentError
| | +-- IOError
| | +-- OSError
| | +-- WindowsError (Windows)
| | +-- VMSError (VMS)
| +-- EOFError
| +-- ImportError
| +-- LookupError
| | +-- IndexError
| | +-- KeyError
| +-- MemoryError
| +-- NameError
| | +-- UnboundLocalError
| +-- ReferenceError
| +-- RuntimeError
| | +-- NotImplementedError
| +-- SyntaxError
| | +-- IndentationError
| | +-- TabError
| +-- SystemError
| +-- TypeError
| +-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning