最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

簡明Python教程·異常&標準庫

2023-02-15 08:00 作者:琉璃汐陽  | 我要投稿

上一篇專欄

異常

當你的程序出現(xiàn)例外情況時就會發(fā)生異常(Exception)。例如,當你想要讀取一個文件時, 而那個文件卻不存在,怎么辦?又或者你在程序執(zhí)行時不小心把它刪除了,怎么辦?這些通 過使用異常來進行處理。?

類似地,如果你的程序中出現(xiàn)了一些無效的語句該怎么辦?Python 將會對此進行處理,舉起 (Raises1 它的小手來告訴你哪里出現(xiàn)了一個錯誤(Error)。


?錯誤

你可以想象一個簡單的 print 函數(shù)調用。如果我們把 print 誤拼成 Print 會怎樣?你會 注意到它的首字母是大寫。在這一例子中,Python 會拋出(Raise)一個語法錯誤。

你會注意到一個 NameError 錯誤被拋出,同時 Python 還會打印出檢測到的錯誤發(fā)生的位 置。這就是一個錯誤錯誤處理器(Error Handler2 為這個錯誤所做的事情。?


異常

我們將嘗試(Try)去讀取用戶的輸入內容。按下 [ctrl-d] 來看看會發(fā)生什么事情。

此處 Python 指出了一個稱作 EOFError 的錯誤,代表著它發(fā)現(xiàn)了一個文件結尾(End of File)符號(由 ctrl-d 實現(xiàn))在不該出現(xiàn)的時候出現(xiàn)了。?


處理異常

我們可以通過使用 try..except 來處理異常狀況。一般來說我們會把通常的語句放在 try 代 碼塊中,將我們的錯誤處理器代碼放置在 except 代碼塊中。

案例(保存文 exceptions_handle.py ):

輸出:

它是如何工作的

我們將所有可能引發(fā)異?;蝈e誤的語句放在 try 代碼塊中,并將相應的錯誤或異常的處理器 (Handler)放在 except 子句或代碼塊中。 except 子句可以處理某種特定的錯誤或異常, 或者是一個在括號中列出的錯誤或異常。如果沒有提供錯誤或異常的名稱,它將處理所有錯 誤與異常。

要注意到必須至少有一句 except 字句與每一句 try 字句相關聯(lián)。不然,有一個 try 代碼塊 又有什么意義??

如果沒有任何錯誤或異常被處理,那么將調用 Python 默認處理器,它只會終端程序執(zhí)行并打 印出錯誤信息。我們已經在前面的章節(jié)里見過了這種處理方式。?

你還可以擁有一個 else 子句與 try..except 代碼塊相關聯(lián)。 else 子句將在沒有發(fā)生異常的時候執(zhí)行。

?在下一個案例中,我們還將了解如何獲取異常對象以便我們可以檢索其他信息。?


拋出異常 3?

你可以通過 raise 語句來引發(fā)一次異常,具體方法是提供錯誤名或異常名以及要拋出 (Thrown)異常的對象。

你能夠引發(fā)的錯誤或異常必須是直接或間接從屬于 Exception (異常) 類的派生類。

案例(保存為 exceptions_raise.py ):

輸出:

它是如何工作的?

在本例中,我們創(chuàng)建了我們自己的異常類型。這一新的異常類型叫作 ShortInputException 。 它包含兩個字段——獲取給定輸入文本長度的 length ,程序期望的最小長度 atleast 。?

except 子句中,我們提及了錯誤類,將該類存儲 as(為) 相應的錯誤名或異常名。這類 似于函數(shù)調用中的形參與實參。在這個特殊的 except 子句中我們使用異常對象的 length atlease 字段來向用戶打印一條合適的信息。?


Try ... Finally?

假設你正在你的讀取中讀取一份文件。你應該如何確保文件對象被正確關閉,無論是否會發(fā) 生異常?這可以通過 finally 塊來完成。?

保存該程序為 exceptions_finally.py

輸出:

它是如何工作的?

我們按照通常文件讀取進行操作,但是我們同時通過使用 time.sleep 函數(shù)任意在每打印一 行后插入兩秒休眠,使得程序運行變得緩慢(在通常情況下 Python 運行得非??焖伲?。當程 序在處在運行過過程中時,按下 ctrl + c 來中斷或取消程序。

你會注意到 KeyboardInterrupt 異常被拋出,爾后程序退出。不過,在程序退出之前,finally 子句得到執(zhí)行,文件對象總會被關閉。

另外要注意到我們在 print 之后使用了 sys.stout.flush() ,以便它能被立即打印到屏幕上。


with 語句?

try 塊中獲取資源,然后在 finally 塊中釋放資源是一種常見的模式。因此,還有一個 with 語句使得這一過程可以以一種干凈的姿態(tài)得以完成。?

保存為 exceptions_using_with.py

它是如何工作的?

程序輸出的內容應與上一個案例所呈現(xiàn)的相同。本例的不同之處在于我們使用的是 open 函 數(shù)與 with 語句——我們將關閉文件的操作交由 with open 來自動完成。

在幕后發(fā)生的事情是有一項 with 語句所使用的協(xié)議(Protocol)。它會獲取由 open 語句 返回的對象,在本案例中就是“thefile”。

它總會在代碼塊開始之前調用 thefile.__enter__ 函數(shù),并且總會在代碼塊執(zhí)行完畢之后調 用 thefile.__exit__ 。

因此,我們在 finally 代碼塊中編寫的代碼應該格外留心 __exit__ 方法的自動操作。這能 夠幫助我們避免重復顯式使用 try..finally 語句。?

有關該話題的更多討論已經超出了本書所能涉及的范圍,因此請參考 PEP 343 來了解更加全 面的解釋。?


總結

我們已經討論了 try..except try..finally 語句的用法。同時我們也已經看到了如何創(chuàng) 建我們自己的異常類型,還有如何拋出異常。

接下來,我們將探索 Python 的標準庫。?

  1. 在本章中 Raise 一詞會經常出現(xiàn),沈潔元譯本大都將其譯作“引發(fā)”,此處將按照具體 的語境對該詞的譯法作出調整。 ??

  2. 此處采用沈潔元譯本的翻譯。但是在其它教程或有關 Python 的討論文章中,Handler 大都保留原文而不作翻譯,這點需讀者知悉。 ?

  3. 原文作 Raising Exceptions,沈潔元譯本譯作“引發(fā)異?!?,此處采用更流行的譯法。 ??

標準庫

Python 標準庫(Python Standrad Library)中包含了大量有用的模塊,同時也是每個標準的 Python 安裝包中的一部分。熟悉 Python 標準庫十分重要,因為只要你熟知這些庫可以做到 什么事,許多問題都能夠輕易解決。

?我們將探索這個庫中的一些常用模塊。你能在你的 Python 安裝包中附帶的文檔中的“庫概覽 (Library Reference)” 部分中查找到所有模塊的全部細節(jié)。

讓我們來了解一些有用的模塊。

注意:如果你覺得本章內容過于超前,你可以先跳過本章。不過,我強烈建議你在適應 了采用 Python 進行編程后再來看看本章。


?sys 模塊?

sys 模塊包括了一些針對特定系統(tǒng)的功能。我們已經了解過 sys.argv 列表中包括了命令行參數(shù)。

想象一些我們需要檢查正在使用的 Python 軟件的版本, sys 模塊會給我們相關的信息。

它是如何工作的

?sys 模塊包含一個 version_info 元組,它提供給我們版本信息。第一個條目是主版本信 息。我們可以調出這些信息并使用它。


日志模塊?

如果你想將一些調試(Debugging)信息或一些重要的信息儲存在某個地方,以便你可以檢查 你的程序是否如你所期望那般運行,應該怎么做?你應該如何將這些信息“儲存在某個地方”? 這可以通過 logging 模塊來實現(xiàn)。?

保存為 stdlib_logging.py

import os import platform import logging if platform.platform().startswith('Windows'): logging_file = os.path.join(os.getenv('HOMEDRIVE'), os.getenv('HOMEPATH'), 'test.log') else:logging_file = os.path.join(os.getenv('HOME'), 'test.log') print("Logging to", logging_file) logging.basicConfig( level=logging.DEBUG, format='%(asctime)s : %(levelname)s : %(message)s', filename=logging_file, filemode='w', )logging.debug("Start of the program") logging.info("Doing something") logging.warning("Dying now")?

輸出:

$ python stdlib_logging.py Logging to /Users/swa/test.log $ cat /Users/swa/test.log 2014-03-29 09:27:36,660 : DEBUG : Start of the program 2014-03-29 09:27:36,660 : INFO : Doing something 2014-03-29 09:27:36,660 : WARNING : Dying now?

如果你不能運行 cat 命令,你可以通過一款文本編輯器打開 test.log 文件。?

?它是如何工作的?

我們使用了三款標準庫中的模塊—— os 模塊用以和操作系統(tǒng)交互, platform 模塊用以獲取 平臺——操作系統(tǒng)——的信息, logging 模塊用來記錄(Log)信息。

?首先,我們通過檢查 platform.platform() 返回的字符串來確認我們正在使用的操作系統(tǒng) (有關更多信息,請參閱 import platform; help(platform) )。如果它是 Windows,我們將 找出其主驅動器(Home Drive),主文件夾(Home Folder)以及我們希望存儲信息的文件 名。將這三個部分匯聚到一起,我們得到了有關文件的全部位置信息。對于其它平臺而言, 我們需要知道的只是用戶的主文件夾位置,這樣我們就可獲得文件的全部位置信息。

我們使用 os.path.join() 函數(shù)來將這三部分位置信息聚合到一起。使用這一特殊函數(shù),而非 僅僅將這幾段字符串拼湊在一起的原因是這個函數(shù)會確保完整的位置路徑符合當前操作系統(tǒng) 的預期格式。?

然后我們配置 logging 模塊,讓它以特定的格式將所有信息寫入我們指定的文件。?

最后,無論這些信息是用以調試,提醒,警告甚至是其它關鍵的消息,我們都可以將其聚合 并記錄。一旦程序開始運行,我們可以檢查這一文件,從而我們便能知道程序運行過程中究 竟發(fā)生了什么,哪怕在用戶運行時什么信息都沒有顯示。


?每周模塊系列?

標準庫中還有許多模塊值得探索,例如一些用以調試(Debugging)的模塊, 處理命令行選 項的模塊,正則表達式(Regular Expressions)模塊 等等等等。 進

一步探索標準庫的最好方法是閱讀由 Doug Hellmann 撰寫的優(yōu)秀的 Python Module of the Week 系列(你還可以閱讀它的實體書或是閱讀 Python 官方文檔)。?


總結

我們已經探索了 Python 標準庫中提供的諸多的模塊的一些功能。在此強烈建議你瀏覽 Python 標準庫文檔來了解所有可以使用的模塊。?

接下來,我們將介紹 Python 的其它各個方面,讓我們的 Python 之旅更加完整。

下一篇專欄


簡明Python教程·異常&標準庫的評論 (共 條)

分享到微博請遵守國家法律
荥经县| 岗巴县| 阿图什市| 肥乡县| 荃湾区| 崇礼县| 蒙城县| 石棉县| 舒兰市| 巴林右旗| 莆田市| 曲松县| 安平县| 鸡西市| 安仁县| 江西省| 额尔古纳市| 安阳县| 深圳市| 宜章县| 长治市| 卢龙县| 汽车| 延川县| 夏河县| 额敏县| 阿勒泰市| 久治县| 呼图壁县| 南阳市| 开化县| 瓦房店市| 北海市| 荆州市| 诸暨市| 门头沟区| 安塞县| 乡宁县| 美姑县| 平潭县| 广宁县|