Errors and Exceptions :
error 有兩種 syntax errors 與 exceptions, 底下我們就來談談這兩種 errors.
Syntax Errors :
語法錯誤簡單來說就是你的 script 給 Python 解析時, 它無法辨識你的語法 :
Exceptions :
還有一些 error 是發生在執行時期, 運算時產生的 exception. 這類的錯誤是可以透過一些機制補救處理的. 常見如下 :
常見標準的 built-in Exception 可以在 這裡 找到相關說明.
Handling Exceptions :
有些時候你可能希望在這些 Exceptions 發生時進行處理, 例如底下程式碼會在 Console 提供使用者輸入字串, 接著透過函式 int() 進行轉換. 如果你輸入的不是個合法字串, 則會發生 ValueError exception, 或者你直接按下 Ctrl + C (通常是在 Windows 下.) 則會發生 KeyboardInterrupt exception :
上面有使用到 try 關鍵字, 用法如下說明 :
一個 try 的 statement 可以搭配多個 exception 的 handle, 甚至在同一個 handle 可以有多個 Exception 種類 :
如果你希望有一個預設的 handle (即當 Exception 發生時, 所有設定的 Exception 類別都沒比對到時, 則執行預設 handle), 那就在 except 關鍵字後不用給任何 Exception 種類. 如下範例如果 Exception 發生時, 既不是 IOError 也不是 ValueError 時, 則執行最後一個 except clause :
- import sys
- try:
- f = open('myfile.txt')
- s = f.readline()
- i = int(s.strip())
- except IOError as (errno, strerror):
- print "I/O error({0}): {1}".format(errno, strerror)
- except ValueError:
- print "Could not convert data to an integer."
- except:
- print "Unexpected error:", sys.exc_info()[0]
- raise
你也可以自己 raise Exception 並且傳入參數. 所有傳入的參數會被存放在 instance.args. 通常標準的 Exception 會定義函式 __str__() 將這些參數顯示出來. 下面是一個簡單範例 :
Exception 的捕抓是 Recursive, 如果你在 try clause 中呼叫一個函式, 而該函式產生 Exception 的話且沒有 try clause 的話, 則外面的 try clause 可以捕捉 :
Raising Exceptions :
透過 raise 語法可以讓你強迫觸發 except clause :
另外如果你已經進入 exception clause, 但是你可能不想處理當前的 Exception, 則你可以在該 exception clause 在呼叫一次 raise 以重新拋出該 Exception 給更外部的 try clause :
User-defined Exceptions :
程式人員可以透過繼承類別 Exception 來撰寫自己的例外類別 (see Classes for more about Python classes)
通常在實際應用中, 每個 Module 會重新定義自己的 Exception/Error base 類別 (繼承自 Exception 類別), 接著特定的 Error/Exception 再繼承該類別 :
- class Error(Exception):
- """Base class for exceptions in this module."""
- pass
- class InputError(Error):
- """Exception raised for errors in the input.
- Attributes:
- expr -- input expression in which the error occurred
- msg -- explanation of the error
- """
- def __init__(self, expr, msg):
- self.expr = expr
- self.msg = msg
- class TransitionError(Error):
- """Raised when an operation attempts a state transition that's not
- allowed.
- Attributes:
- prev -- state at beginning of transition
- next -- attempted new state
- msg -- explanation of why the specific transition is not allowed
- """
- def __init__(self, prev, next, msg):
- self.prev = prev
- self.next = next
- self.msg = msg
Defining Clean-up Actions :
try 用法還有另一個 optional clause (finally). 確保當不論如何這個 clause 一定會被執行到, 主要是作為 Clean-up 的功用存在, 範例如下 :
底下是官網對於 finally clause 的說明 :
由下面的範例可以知道, 只要是離開 try clause, finally clause 就一定會被執行到 :
Predefined Clean-up Actions :
其實在 Python 的某些類別也提供一些簡潔的方法讓你做 Clean-up 的動作 (也就是不論成功或失敗都會執行!). 考慮代碼如下 :
- for line in open("myfile.txt"):
- print line
- with open("myfile.txt") as f:
- for line in f:
- print line
* [Python 學習筆記] 起步走 : 陳述句 (try、raise 陳述句)
* [Python 學習筆記] 進階議題 : 例外 (使用 with as)
沒有留言:
張貼留言