程式設計師的一生中,錯誤幾乎每天都在發生。在過去的一個時期,錯誤要麼對程序是致命的,要麼產生一堆無意義的輸出。所以,人們需要一個柔和的處理錯誤的方法,而不是終止執行。當然,這一切都是在異常和異常處理出現之前的事了。
Python中的異常
從軟體方面來說,錯誤是語法或是邏輯上的。語法錯誤是軟體的結構上有錯誤,導致不能被解釋器解釋或編譯器無法編譯。這些錯誤必須在程序執行前糾正。當語法正確後,剩下的就是邏輯錯誤了。邏輯錯誤可能是由於不完整或是不合法的輸入所致。當Python檢測到一個錯誤時,解釋器就會指出當前流已經無法繼續執行下去,這時候就出現了異常。我們來看幾個異常的例子。
NameError:嘗試訪問一個未申明的變量SyntaxError:Python解釋器語法錯誤IndexError:請求的索引超過序列範圍KeyError:請求一個不存在的字典關鍵字IOError:輸入/輸出錯誤AttributeError:嘗試訪問未知的對象屬性
檢測和處理異常
異常可以通過try語句來檢測。任何在try語句塊裡的代碼都會被監測,檢查有無異常發生。
try語句有兩種主要形式:try-except和try-finally。一個try語句可以對應一個或多個except子句,但只能對應一個finally子句,或是一個try-except-finally複合語句。我們還可以在一個except子句裡處理多個異常,except語句在處理多個異常時要求異常被放在一個元組裡。
with語句
類似try-except-finally,with語句也是用來簡化代碼的,with語法的基本用法如下:with context_expr [as var]: with_suite。看起來如此簡單,但並不如看上去那麼容易。簡單演示下打開文件的例子。
觸發異常
到目前為止,我們見到的所有異常都是由解釋器引發的。由於執行期間的錯誤而引發。程式設計師在編寫API時也希望在遇到錯誤的輸入時觸發異常,為此,Python提供了一種機制讓程式設計師明確的觸發異常,這就是raise語句。raise一般的用法是:raise [SomeException [, args, [, traceback]]],第一個參數觸發異常的名字。如果有,必須是一個字符串,類或實例。第二個符號為可選的args(比如參數,值),來傳給異常。最常見的用法為SomeException是一個類,不需要其他的參數。
異常和sys模塊
另一種獲取異常信息的途徑是通過sys模塊中的exc_info()函數。此功能提供了一個3元組的信息,多於我們單純用異常參數所能獲得的。