NameError 嘗試通路一個未申明的變量
ZeroDivisionError 除數為零
SyntaxError 解釋器文法錯誤
IndexError 請求的索引超出序列範圍
KeyError 請求一個不存在的字典關鍵字
IOError 輸入/輸出錯誤
AttributeError 嘗試通路未知的對象屬性
異常可以通過try語句來檢測。任何在try語句塊裡的代碼都會被監測,檢查有無異常發生。
try語句有兩種主要形式:try-except和try-finally。這兩個語句是互斥的,也就是說你隻能使用其中的一種。一個try語句可以對應一個或多個except子句,但隻能對應一個finally子句,或是一個try-except-finally複合語句。
你可以使用try-except語句檢測和處理異常。你也可以添加一個可選的else子句處理沒有探測到異常的執行的代碼。而try-finally隻允許檢測異常并做一些必要的清除工作,沒有任何異常處理設施。
try:
try_suite
except Exception[,reason]:
except_suite
try語句塊中異常發生點後的剩餘語句永遠不會到達,是以也永遠不會執行。處理流程:忽略代碼,繼續執行和向上移交。
可以把多個except語句連接配接在一起,處理一個try塊中可能發生的多種異常。
except Exception1[,reason]:
except_suite1
except Exception2[,reason]:
except_suite2
也可以在一個except子句裡處理多個異常。except語句在處理多個異常時要求異常被放在一個元組裡:
except (Exception1,Exception2)[,reason]:
except_suite1_and_suite2
如果要捕獲所有的異常呢?
第一種:Exception是在最頂層的。
try:
:
except Exception,e:
#error occurred,log 'e',etc.
第二種:不推薦
except:
#error occurred,etc.
BaseException下面分别有三大類異常:KeyboardInterrupt、SystemExit和Exception。所有目前内建異常都放在Exception下。
底線:避免把大片的代碼裝入try-except中然後使用pass忽略掉錯誤。
一般來說,異常的名字已經是一個滿意的線索了,但這個錯誤字元串會提供更多的資訊。
__class__屬性存在于所有的類執行個體中,而__doc__類屬性存在于所有的定義了文檔字元串的類中。
采用字元串化的異常參數來替換單一的錯誤資訊:
def safe_float(object):
try:
retval=float(object)
except (ValueError,TypeError),diag:
retval=str(diag)
return retval
在try範圍中沒有異常被檢測到時,執行else子句。
finally子句是無論異常是否發生,是否捕捉都會執行的一段代碼。
A
except MyException:
B
else:
C
finally:
D
無論如何,你都可以有不止一個的except子句,但最少有一個except語句,而else和finally都是可選的。
另一種finally的使用方式是finally單獨和try連用。
如果finally中的代碼引發了另一個異常或由于return、break、continue文法而終止,原來的異常将丢失而且無法重新引發。
with語句是用來簡化代碼的。
try-except和try-finally的一種特定的配合用法是保證共享的資源的唯一配置設定,并在任務結束的時候釋放它。
with語句的目的在于從流程圖把try、except和finally關鍵字和資源配置設定釋放相關代碼統統去掉,而不像try-except-finally那樣僅僅簡化代碼使之易用。
with context_expr [as var]:
with_suite
上下文管理器主要作用于共享資源。
python提供了一種機制讓程式員明确的觸發異常,這就是raise語句。
不含參數的raise語句結構會引發目前代碼塊最近觸發的一個異常。如果之前沒有異常觸發,會因為沒可以有重新觸發額異常而生成一個TypeError異常。
斷言是一句必須等價于布爾真的判定,發生異常也就意味着表達式為假。
斷言可以簡簡單單的想象為raise-if語句。測試一個表達式,如果傳回值為假,就觸發異常。
assert expression[,arguments]
另一種擷取異常資訊的途徑是通過sys子產品中exc_info()函數。
#通過引發的異常資訊,能夠快速定位到問題并調試,找出處理錯誤的辦法。
filename=raw_input('Enter file name:')
fobj=open(filename,'r')
for eachLine in fobj:
print eachLine,
fobj.close()
except IOError,e:
print'file open error:',e
也可以通過raise語句故意引發一個異常。
本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/1960329,如需轉載請自行聯系原作者