異常處理是Python工程中補課避免的,進行異常處理,可以幫我們調試代碼,使代碼找起問題更加簡單,更加容易哦。
一般都是利用Try,比較簡單,代碼也不復雜。
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()
捕獲到了,就可以處理:
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...'
也就是說,不需要在每個可能出錯的地方去捕獲錯誤,只要在合適的層次去捕獲錯誤就可以了。這樣一來,就大大減少了寫try...except...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
聲明失敗時提起。
-
異常
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