簡介 當你的程式不能正常運行的時候,Python會在控制台列印一段提醒,告訴你一個錯誤,這個錯誤就是異常。 錯誤 我在控制台寫了一段無效的代碼,將print()的括弧去掉,在執行這條語句的時候,系統提示語法錯誤,無效的語句(我百度翻譯的)。這就是錯誤處理器所作的工作。 再換一種方式寫錯誤: 在程式獲 ...
簡介
當你的程式不能正常運行的時候,Python會在控制台列印一段提醒,告訴你一個錯誤,這個錯誤就是異常。
錯誤
我在控制台寫了一段無效的代碼,將print()的括弧去掉,在執行這條語句的時候,系統提示語法錯誤,無效的語句(我百度翻譯的)。這就是錯誤處理器所作的工作。
再換一種方式寫錯誤:
在程式獲取用戶輸入的時候,我們使用CTRL+d引發了一個EOFError錯誤,接下來我們嘗試去處理這樣的錯誤。
處理異常
使用try---except語句來處理異常。我們通常把容易產生異常的語句放置在try塊中,把做異常處理的語句放在except塊中。
import sys try: a = input('Enter something:') except(EOFError): print('\nWhy did you do an EOF on me ?') sys.exit() except: print('\nSome error/exception occurred.') print('Done')
運行結果
我們把所有可能引發錯誤的語句放在try
塊中,然後在except
從句/塊中處理所有的錯誤和異常。except
從句可以專門處理單一的錯誤或異常,或者一組包括在圓括弧內的錯誤/異常。如果沒有給出錯誤或異常的名稱,它會處理 所有的 錯誤和異常。對於每個try
從句,至少都有一個相關聯的except
從句。
你還可以讓try..catch
塊關聯上一個else
從句。當沒有異常發生的時候,else
從句將被執行。
import sys try: a = input('Enter something:') except(EOFError): print('\nWhy did you do an EOF on me ?') sys.exit() except: print('\nSome error/exception occurred.') else: print('no error') print('Done')
運行結果
raise引發異常
你可以使用raise語句拋出異常。你需要指明錯誤/異常的名稱和伴隨異常觸發的異常對象。這個異常應該是Error和Exception類的子類。這就用到了繼承的思想,使用__init__方法初始一些方法和參數。
class ShortInputException(Exception): def __init__(self,length,atleast): Exception.__init__(self) self.length = length self.atleast = atleast try: s = input('Enter something-->') print(len(s)) if len(s) < 3: raise ShortInputException(len(s),atleast = 3) except(EOFError): print('\nWhy did you do an EOF on me ?') except(ShortInputException) as x: print('ShortInputException: The in input was of length %d,\ was expecting at least %d' % (x.length,x.atleast)) else: print('No exception was raised.')
運行結果
try...finally
假如在你讀文件的時候發生了異常,但是無論如何文件都要關閉。這個時候該怎麼做呢?
這裡我們需要使用finally塊來完成。
在使用try捕獲異常的時候,我們可以同時使用except塊和finally塊。
import time try: f = open('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函數,裡面的參數是它的運行間隔。
這樣我們就有時間去使用CTRL+c使程式發生異常。這時候我們發現finally塊中的語句還是運行的,文件正常關閉了。