錯誤和異常
NameError 嘗試訪問一個未申明的變量
ZeroDivisionError 除數為零
SyntaxError 解釋器語法錯誤
IndexError 請求的索引超出序列範圍
KeyError 請求一個不存在的字典關鍵字
IOError 輸入/輸出錯誤
AttributeError 嘗試訪問未知的對象屬性
異常可以通過try語句來檢測。任何在try語句塊裏的代碼都會被監測,檢查有無異常發生。
try語句有兩種主要形式:try-except和try-finally。這兩個語句是互斥
你可以使用try-except語句檢測和處理異常。你也可以添加一個可選的else子句處理沒有探測到異常的執行的代碼。而try-finally只允許檢測異常並做一些必要的清除工作,沒有任何異常處理設施。
try:
try_suite
except Exception[,reason]:
except_suite
try語句塊中異常發生點後的剩余語句永遠不會到達,所以也永遠不會執行。處理流程:忽略代碼,繼續執行和向上移交。
可以把多個except語句連接在一起,處理一個try塊中可能發生的多種異常。
try:
try_suite
except Exception1[,reason]:
except_suite1
except Exception2[,reason]:
except_suite2
也可以在一個except子句裏處理多個異常。except語句在處理多個異常時要求異常被放在一個元組裏:
try:
try_suite
except (Exception1,Exception2)[,reason]:
except_suite1_and_suite2
如果要捕獲所有的異常呢?
第一種:Exception是在最頂層的。
try:
:
except Exception,e:
#error occurred,log ‘e‘,etc.
第二種:不推薦
try:
:
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子句是無論異常是否發生,是否捕捉都會執行的一段代碼。
try:
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()函數。
#通過引發的異常信息,能夠快速定位到問題並調試,找出處理錯誤的辦法。
try:
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語句故意引發一個異常。
本文出自 “Gorilla City” 博客,請務必保留此出處http://juispan.blog.51cto.com/943137/1960329
錯誤和異常