1. 程式人生 > >錯誤和異常

錯誤和異常

python


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塊中可能發生的多種異常。


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

錯誤和異常