A Byte of Python 筆記(11)異常:try..except、try..finally

來源:互聯網
上載者:User

標籤:

第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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.