03.07 Python學習入門(25)—錯誤和異常(二)

(本號正在連續推出以Python官網文檔為主線的系統學習Python的系列文章或視頻,感興趣的朋友們歡迎搜索關注。在這裡學習Python事半功倍!本文及後續文章如無特別聲明均以Windows平臺作為演示平臺,Python版本為:3.8.1)


本篇繼上篇繼續講解"錯誤與異常"部分的內容

拋出異常

可以使用raise拋出異常。示例:

Python學習入門(25)—錯誤和異常(二)

【示例】使用raise拋出異常

raise唯一的參數用來表示要拋出的異常。該參數必須是一個異常實例或一個異常類(一個從exception派生的類)。如果傳遞的是一個異常類,則會隱式地調用它的不帶參數的構造函數來實例化一個該類的對象。

如果只是需要確定是否拋出了異常,而不打算處理它,則可以使用raise語句的如下簡單形式重新拋出異常:

Python學習入門(25)—錯誤和異常(二)

【示例】確定並從新拋出異常

用戶定義的異常

程序可以通過創建一個新的異常類來自定義異常(有關Python類的更多信息將在本系列後續文章中詳細介紹)。異常通常直接或間接地從Exception類派生。雖然自定義異常類可以像任何其他類一樣執行的任何操作,但通常儘量讓定義保持簡單且只提供一些屬性來供異常處理程序提取有關錯誤信息。當創建一個可能引起幾個不同錯誤的模塊時,通常的做法是先為該模塊定義一個異常基類,然後針對不同的錯誤條件為該基類創建特定的子類:

Python學習入門(25)—錯誤和異常(二)

【示例】用戶自定義異常類型

需要說明的是:異常類最好以“Error”結尾的名稱命名的,這種命名方式是標準異常使用的方式。許多標準模塊定義了自己的異常,以表示在其定義的函數中可能發生的錯誤。

finally子句

try語句還有一個可選的finally子句,用於定義在那些任何情況下都必須執行的清理操作。例如:

Python學習入門(25)—錯誤和異常(二)

【示例】finally語句

如果出現了finally子句,那麼finally子句將作為try語句完成之前的最後一個任務執行。不管try語句是否產生異常,finally子句都會運行。下面是發生異常時更復雜的情況:

  • 如果在執行try子句期間發生異常,則可以使用except子句處理該異常。如果except子句沒有處理異常,則在finally子句執行後重新引發異常。
  • 對在執行except或else子句期間發生異常同樣是在執行了finally子句之後再次被重新拋出。
  • 如果try語句到達一個break、continue或return語句,那麼finally子句將在break、continue或return語句執行之前執行。
  • 如果finally子句包含一個返回語句,那麼返回的值將是finally子句中返回語句的值,而不是try子句中返回語句的值。

示例:

Python學習入門(25)—錯誤和異常(二)

【示例】finally子句

更復雜的示例:

Python學習入門(25)—錯誤和異常(二)

【示例】finally子句

如上例,finally子句在任何情況下都會執行。例子中由兩個字符串相除引起的類型錯誤沒有被except子句處理,因此在finally子句執行後重新被拋出。在實際應用程序中,不管資源的使用是否成功,finally子句對於保證外部資源(例如文件或網絡連接)的釋放都很有用的。

with語句

有些對象定義了標準清理操作,該清理操作在該對象不再被需要時並且不管之前使用該對象的操作是否成功都需要被執行。請看下面的示例,它嘗試打開一個文件myfile.txt並將其內容打印到屏幕上。

<code>for line in open("myfile.txt"):
print(line, end="")/<code>

這段代碼的問題是,在這部分代碼執行完之後,文件會在一段時間內仍舊保持打開。這在簡單的腳本中不是問題,但對於較大的應用程序可能會產生問題。使用with語句可以確保像文件這樣的對象在使用後總是能被及時正確地清理。

<code>with open("myfile.txt") as f:
for line in f:
print(line, end="")/<code>

在執行語句之後,文件f總是關閉的,即使在處理這些行時遇到了問題也是一樣的。


【結束】


分享到:


相關文章: