標籤:
第13章 異常
當你的程式中出現某些 異常的 狀況的時候,異常就發生了。
錯誤
假如我們把 print 誤拼為 Print,注意大寫,這樣 Python 會 引發 一個語法錯誤。
有一個SyntaxError被引發,並且檢測到的錯誤位置也被列印了出來。這是這個錯誤的錯誤處理器 所做的工作。
try..except
我們嘗試讀取使用者的一段輸入。按Ctrl-z(Linux 使用者按 Ctrl-d),看一下會發生什麼。
Python引發了一個稱為EOFError的錯誤,這個錯誤基本上意味著它發現一個不期望的 檔案尾 (由 Ctrl-z 表示)
處理異常
可以使用 try..except 語句來處理異常,try-塊 放通常的語句,except-塊放錯誤處理語句。
# -*- coding: utf-8 -*-# Filename: try_except.pyimport systry: s = raw_input(‘Enter something -->‘)except EOFError: print ‘\nWhy did you do an EOF on me?‘ sys.exit() # exit the programexcept: print ‘\nSome error/exception occurred.‘ # here, we are not exiting the programprint ‘Done‘
把所有可能引發錯誤的語句放在 try 塊中,在 except 從句/塊中處理所有的錯誤和異常。
except 從句可以專門處理單一的錯誤或異常,或者一組包括在圓括弧內的錯誤/異常。如果沒有給出錯誤或異常的名稱,它會處理 所有的 錯誤和異常。對於每個 try 從句,至少都有一個相關聯的 except 從句。
如果某個錯誤或異常沒有被處理,預設 python 處理器被調用。它會終止程式運行,並且列印一個訊息。
還可以讓 try..catch 塊關聯上一個 else 從句。當沒有異常發生的時候,else 從句將被執行。
引發異常
使用 raise 語句 引發 異常。還得指明錯誤/異常的名稱和伴隨異常 觸發的 異常對象,引發的錯誤或異常應該分別是一個 Error 或 Exception 類的直接或間接匯出類。
# -*- coding: utf-8 -*-# Filename: raising.pyclass ShortInputException(Exception): ‘‘‘A user-defined exception class.‘‘‘ def __init__(self,length,atleast): Exception.__init__(self) self.length = length self.atleast = atleasttry: s = raw_input(‘Enter something -->‘) if len(s) < 3: raise ShortInputException(len(s),3) # other work can continue as usual hereexcept EOFError: print ‘\nWhy did you do an EOF on me?‘except ShortInputException, x: print ‘ShortInputException: The input was of length %d, was excepting at least %d‘ % (x.length, x.atleast)else: print ‘No exception was raised‘
此處我們自訂了新的異常類型 ShortInputException 類,有兩個域——length 給定輸入的長度,atleast 是程式期望的最小長度。
except 從句中,提供了錯誤類和用來表示錯誤/異常對象的變數。這與函數調用中的形參和實參概念類似。我們使用異常對象的 length 和 atleast 域來為使用者列印一個恰當的訊息。
try..finally
finally 塊是必然執行的。在一個 try 塊下,可以同時使用 except 從句和 finally 塊,需要把一個嵌入另外一個。
# -*- coding: utf-8 -*-# Filename: finally.pyimport timetry: f = file(‘poem.txt‘) while True: # our usual file-reading idiom line = f.readline() if len(line) == 0: break time.sleep(2) print line,finally: f.close() print ‘Cleaning up...closed the file.‘
我們有意在列印一行之前用 time.sleep 方法暫停2秒鐘,讓程式運行慢一些。程式運行時,按 Ctrl-c 中斷/取消 程式,觸發 KeyboardInterrupt 異常。但在程式退出之前,finally 從句仍被執行,檔案關閉。
A Byte of Python 筆記(11)異常:try..except、try..finally