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

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

深入理解Python中的try-except語句,避免代碼崩潰的噩夢

2023-04-18 20:56 作者:py愛好loer  | 我要投稿

不管是開發(fā)Python、Java、JavaScript程序,還是寫C++、PHP、GO、Ruby代碼。都離不開try ... except異常處理。至于為什么,一切為了程序/產(chǎn)品/項目的穩(wěn)定運行。如果一個程序項目或者說小一點一個文件中沒有一個try-except處理,那么這個程序是有漏洞的、是不穩(wěn)定的,很容易就會崩潰的。

而我們經(jīng)常在代碼開發(fā)時,特別是框架項目開發(fā)時,多個模塊(文件)是會存在調(diào)用的情況,有單向的,也有雙向的。而在此時如果程序發(fā)生異常,try-except只會基于當前位置進行信息打印(我說的是Except as e),很難去定位到模塊調(diào)用,也就是源頭文件的位置。今天分享的內(nèi)容就是如何定位源頭文件及行數(shù)。

Python try-except例子:

在這個例子中,我們將除法運算代碼封裝到了一個名為divide的函數(shù)中。函數(shù)的第一個參數(shù)a表示被除數(shù),第二個參數(shù)b表示除數(shù)。在函數(shù)體中,我們使用try except語句對除以0的異常進行了處理。如果程序沒有遇到ZeroDivisionError異常,那么函數(shù)將成功計算結(jié)果并返回。如果程序遇到ZeroDivisionError異常,我們將輸出具體的錯誤信息并返回None。

輸出結(jié)果:


定位源頭文件(報錯源)

大多時候我們在大工程或者復雜程序里,僅僅打印e只能簡單的顯示出程序出錯的信息,有時我們僅僅根據(jù)這個信息很難定位,錯誤究竟發(fā)生在哪一個文件、哪一行代碼,這時候比較笨的調(diào)試方法就是去掉try-except再跑一次讓程序崩潰顯示出具體的信息。

而比較快速便捷的定位錯誤信息就是定位到發(fā)生錯誤具體的行和文件,其實我們可以利用錯誤對象e,它其實是有相關(guān)的屬性可調(diào)用的。

輸出結(jié)果:

或者還可以借助內(nèi)置模塊traceback實現(xiàn)


進階用法

這個時候還會有一些問題,就是源頭報錯文件是一個三方庫或者內(nèi)置庫,比如文件位置是python環(huán)境site-packages中,那我們打印出來并沒有太大的用處,我們想打印的是我們自己寫的代碼報錯位置,而不是內(nèi)置模塊或安裝的第三方模塊報錯的位置信息,只有找到自定義代碼位置,才好進行優(yōu)化修正。

可以使用traceback.extract_stack()替換traceback.extract_tb(),以排除第三方庫的源代碼位置。

使用traceback.extract_stack()方法獲取異常發(fā)生的完整堆棧信息。然后,使用list slicing來去掉最后一個元素,因為這個元素代表當前調(diào)用的位置,而不是異常發(fā)生的位置。最后一個元素通常是包含你的調(diào)用代碼的位置,所以你不想把它包含進來。然后,從可用的堆棧信息中提取最后一個源代碼文件名、行號、函數(shù)名和代碼行來確定異常發(fā)生的位置。

這個方法不會包含第三方庫的源代碼位置,并且只會提取與你的代碼相關(guān)的源代碼位置。

還可以使用Python標準庫中的inspect模塊的currentframe()函數(shù)來獲取當前幀。然后,你可以使用traceback.extract_stack()方法來提取堆棧信息,然后使用堆棧信息來逐步比較源文件路徑,以找到與當前工程相關(guān)的源文件路徑。

上述代碼中,get_project_traceback函數(shù)首先使用inspect.currentframe()函數(shù)獲取當前幀,然后使用traceback.extract_stack(frame)方法提取堆棧信息,前兩個元素是filter和get_project_traceback函數(shù)本身的位置,所以從第3個元素開始獲取。接著,函數(shù)使用os.getcwd()來獲取當前工程的路徑,并逐個比較每個源文件路徑,找到與當前工程相關(guān)的源文件路徑。如果都沒有找到,則返回最后一個源文件。

在主代碼塊中,通過調(diào)用get_project_traceback函數(shù)來獲取與當前工程相關(guān)的堆棧信息。當一個異常發(fā)生時,該代碼段將獲取該異常的信息并使用get_project_traceback函數(shù)來打印與當前工程相關(guān)的堆棧信息。

今天分享了筆者在工作學習當中遇到的try-except問題,希望對大家有幫助!也歡迎大家積極評論,互幫互助!

深入理解Python中的try-except語句,避免代碼崩潰的噩夢的評論 (共 條)

分享到微博請遵守國家法律
梁平县| 苏尼特右旗| 钟祥市| 那曲县| 凭祥市| 潞城市| 兴化市| 陕西省| 中阳县| 东光县| 高陵县| 洛川县| 迭部县| 理塘县| 华蓥市| 康定县| 大埔县| 饶河县| 昆明市| 班戈县| 仲巴县| 江口县| 高要市| 红桥区| 宜阳县| 黄大仙区| 惠东县| 金川县| 玉林市| 博野县| 建始县| 板桥市| 仙居县| 平江县| 前郭尔| 阜阳市| 茶陵县| 景洪市| 都昌县| 沈丘县| 三台县|