
Python 異常處理的實例詳解
與許多面向對象語言一樣,Python 具有異常處理,通過使用 try...except 塊來實現。
Note: Python v s. Java 的異常處理
Python 使用 try...except 來處理異常,使用 raise 來引發異常。Java 和 C++ 使用 try...catch 來處理異常,使用 throw 來引發異常。
異常在 Python 中無處不在;實際上在標準 Python 庫中的每個模塊都使用了它們,并且 Python 自已會在許多不同的情況下引發它們。在整本書中你已經再三看到它們了。
? 使用不存在的字典關鍵字 將引發 KeyError 異常。
? 搜索列表中不存在的值 將引發 ValueError 異常。
? 調用不存在的方法 將引發 AttributeError 異常。
? 引用不存在的變量 將引發 NameError 異常。
? 未強制轉換就混用數據類型 將引發 TypeError 異常。
在這些情況下,我們都在簡單地使用 Python IDE:一個錯誤發生了,異常被打印出來 (取決于你的 IDE,可能會有意地以一種刺眼的紅色形式表示),這便是。這叫做未處理異常;當異常被引發時,沒有代碼來明確地關注和處理它,所以異常被傳給置在 Python 中的缺省的處理,它會輸出一些調試信息并且終止運行。在 IDE 中,這不是什么大事,但是如果發生在你真正的 Python 程序運行的時候,整個程序將會終止。
然而,一個異常不一定會引起程序的完全崩潰。當異常引發時,可以被處理掉。有時候一個異常實際是因為代碼中的 bug (比如使用一個不存在的變量),但是許多時候,一個異常是可以預見的。如果你打開一個文件,它可能不存在。如果你連接一個數據庫,它可能不可連接或沒有訪問所需的正確的安全證書。如果知道一行代碼可能會引發異常,你應該使用一個 try...except 塊來處理異常。
1. 打開一個不存在的文件
(1) 使用內置 open 函數,我們可以試著打開一個文件來讀取 (在下一節有關于open 的更多內容)。但是那個文件不存在,所以這樣就引發 IOError 異常。因為我們沒有提供任何顯式的對 IOError 異常的檢查,Python 僅僅打印出某個關于發生了什么的調試信息,然后終止。
(2) 我們試圖打開同樣不存在的文件,但是這次我們在一個 try...except 內來執行它。
(3) 當 open 方法引發 IOError 異常時,我們已經準備好處理它了。except IOError: 行捕捉異常,接著執行我們自已的代碼塊,這個代碼塊在本例中只是打印出更令人愉快的錯誤信息。
(4) 一旦異常被處理了,處理通常在 try...except
塊之后的第一行繼續進行。注意這一行將總是打印出來,無論異常是否發生。如果在你的根目錄下確實有一個叫 notthere 的文件,對 open
的調用將成功,except 子句將忽略,并且最后一行仍將執行。
異??赡芸瓷先ゲ挥押?
(畢竟,如果你不捕捉異常,整個程序將崩潰),但是考慮一下別的方法。你該不會希望獲得一個指向不存在的文件的對象吧?不管怎么樣你都得檢查它的有效性,而且如果你忘記了,你的程序將會在下面某個地方給出奇怪的錯誤,這樣你將不得不追溯到源程序。我確信你做過這種事;這可并不有趣。使用異常,一發生錯誤,你就可以在問題的源頭通過標準的方法來處理它們。
2. 為其他用途使用異常
除了處理實際的錯誤條件之外,對于異常還有許多其它的用處。在標準 Python 庫中一個普通的用法就是試著導入一個模塊,然后檢查是否它能使用。導入一個并不存在的模塊將引發一個 ImportError 異常。你可以使用這種方法來定義多級別的功能――依靠在運行時哪個模塊是有效的,或支持多種平臺 (即平臺特定代碼被分離到不同的模塊中)。你也能通過創建一個從內置的 Exception 類繼承的類定義你自己的異常,然后使用 raise 命令引發你的異常。如果你對此感興趣,請看進一步閱讀的部分。
下面的例子演示了如何使用異常支持特定平臺功能。代碼來自 getpass 模塊,一個從用戶獲得口令的封裝模塊。獲得口令在 UNIX、Windows 和 Mac OS 平臺上的實現是不同的,但是這個代碼封裝了所有的不同之處。
(1) termios 是 UNIX 獨有的一個模塊,它提供了對于輸入終端的底層控制。如果這個模塊無效 (因為它不在你的系統上,或你的系統不支持它),則導入失敗,Python 引發我們捕捉的 ImportError 異常。
(2) OK,我們沒有 termios,所以讓我們試試 msvcrt,它是 Windows 獨有的一個模塊,可以提供在 Microsoft Visual C++ 運行服務中的許多有用的函數的一個 API。如果導入失敗,Python 會引發我們捕捉的 ImportError 異常。
(3) 如果前兩個不能工作,我們試著從 EasyDialogs 導入一個函數,它是 Mac OS 獨有的一個模塊,提供了各種各樣類型的彈出對話框。再一次,如果導入失敗,Python 會引發一個我們捕捉的 ImportError 異常。
(4) 這些平臺特定的模塊沒有一個有效 (有可能,因為 Python 已經移植到了許多不同的平臺上了),所以我們需要回頭使用一個缺省口令輸入函數 (這個函數定義在 getpass 模塊中的別的地方)。注意我們在這里所做的:我們將函數 default_getpass 賦給變量 getpass。如果你讀了官方 getpass 文檔,它會告訴你 getpass 模塊定義了一個 getpass 函數。它是這樣做的:通過綁定 getpass 到正確的函數來適應你的平臺。然后當你調用 getpass 函數時,你實際上調用了平臺特定的函數,是這段代碼已經為你設置好的。你不需要知道或關心你的代碼正運行在何種平臺上;只要調用 getpass,則它總能正確處理。
(5) 一個 try...except 塊可以有一條 else 子句,就像 if 語句。如果在 try 塊中沒有異常引發,然后 else 子句被執行。在本例中,那就意味著如果 from EasyDialogs import AskPassword 導入可工作,所以我們應該綁定 getpass 到 AskPassword 函數。其它每個 try...except 塊有著相似的 else 子句,當我們發現一個 import 可用時,就綁定 getpass 到適合的函數。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25