Python中怎么避免濫用try...except

這篇文章主要講解了“Python中怎么避免濫用try...except”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python中怎么避免濫用try...except”吧!

創(chuàng)新互聯(lián)從2013年成立,先為朝陽縣等服務(wù)建站,朝陽縣等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為朝陽縣企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

有不少人在寫 Python 代碼時(shí),喜歡用 try...except Exception,更有甚者一層套一層,不管有沒有用,先套了再說:

鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)ss="dp-xml">ss="alt">def func(): ss="">    try: ss="alt">        "函數(shù)內(nèi)部代碼" ss="">    except Exception as e: ss="alt">        print('函數(shù)錯(cuò)誤:', e) ss=""> ss="alt"> ss="">try: ss="alt">    func() ss="">except Exception as e: ss="alt">    print('函數(shù)錯(cuò)誤:', e)

根本不管是否有必要,總之套上了try...except...就有了安全感。

俄羅斯套娃套多了以后,噩夢(mèng)開始了。我們來看看下面這段報(bào)錯(cuò):

Python中怎么避免濫用try...except

你倒是給我說說,是哪個(gè)函數(shù)出了問題?

如果你飽受濫用try...except...之苦,下面三個(gè)方法可以讓你脫離苦海。

把問題暴露出來

在程序開發(fā)的初期,不要用try...except...。讓 Python 把問題暴露出來。通過 Python  的報(bào)錯(cuò),你可以直接看到是哪一行代碼有問題,具體是什么問題。

甚至有時(shí)候,不僅不需要捕獲異常,你還應(yīng)該主動(dòng)拋出異常。在項(xiàng)目完成以后,如果你做的是一個(gè)第三方庫,是用來給別人調(diào)用的,那么,你應(yīng)該多拋出異常,而不是擅自返回一個(gè)普通的錯(cuò)誤信息。

例如,你要實(shí)現(xiàn)一個(gè)函數(shù):query_name,傳入?yún)?shù)是數(shù)字 id,輸出用戶名。你可能會(huì)這樣寫:

鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)ss="dp-xml">ss="alt">def query_name(user_id): ss="">    if not isinstance(user_id, int): ss="alt">        return {'success': False, 'msg': '用戶 id 必須是整型'} ss="">    ...

但實(shí)際上,更好的做法是,直接拋出一個(gè)異常:

鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)ss="dp-xml">ss="alt">def query_name(user_id): ss="">    if not isinstance(user_id, int): ss="alt">        raise Exception('用戶 id 必須是整型'} ss="">    ...

甚至在某些情況下,你可以使用 Python 的斷言:

鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)ss="dp-xml">ss="alt">def query_name(user_id): ss="">    assert isinstance(user_id, int), '用戶 id 必須是整型' ss="alt">    ...

如下圖所示:

Python中怎么避免濫用try...except

只要 user_id不是整型,就拋出AssertionError。

我們直接執(zhí)行python3 xxx.py時(shí),這些斷言語句會(huì)正常工作。但我們可以通過python3 -o xxx.py來讓所有assert  xxx語句失效。

盡量早地讓異常暴露出來,才能更早地解決問題。

捕獲具體異常而不是所有異常

只捕獲你明確知道的異常。這些異常你知道它為什么會(huì)出現(xiàn),并且你知道應(yīng)該怎么解決它。

例如,我們使用requests請(qǐng)求網(wǎng)站,由于網(wǎng)絡(luò)問題,有時(shí)候可能會(huì)請(qǐng)求超時(shí)。一旦超時(shí) requests 就會(huì)拋出超時(shí)異常,如下圖所示:

Python中怎么避免濫用try...except

這種情況下,你知道這個(gè)地方可能會(huì)出現(xiàn)Timeout異常,并且你知道出現(xiàn)的時(shí)候,重試就可以了。于是,你可以捕獲這個(gè)異常:

Python中怎么避免濫用try...except

大家注意,在這個(gè)地方,requests 執(zhí)行了.json()方法。如果URL 返回的內(nèi)容可能不是 JSON  格式的字符串,這里就會(huì)報(bào)JSONDecodeError,如下圖所示:

Python中怎么避免濫用try...except

如果你不做區(qū)分,一股腦直接用 except  Exception,那么你怎么知道,到底是你能夠正常處理的超時(shí)問題,還是你不能正常處理的網(wǎng)站內(nèi)容返回異常?

所以,只捕獲你知道它為什么會(huì)發(fā)生并且你知道如何處理的異常。對(duì)于你無法預(yù)料的或者無法處理的異常,直接拋出。不要擅自捕獲。

強(qiáng)行打印報(bào)錯(cuò)信息

如果實(shí)在是萬不得已,你必須用try...except Exception,如何把具體報(bào)錯(cuò)的位置打印出來呢?其實(shí)也是有方法的。那就是使用  Python 自帶的traceback模塊。

它的用法非常簡單:

鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)ss="dp-xml">ss="alt">import traceback ss=""> ss="alt">try: ss="">    1 + 'a' ss="alt">except Exception: ss="">    print(traceback.format_exc())

運(yùn)行效果如下圖所示:

Python中怎么避免濫用try...except

成功把異常所在的行數(shù)和具體的錯(cuò)誤類型打印了出來。顯然,這樣寫你需要平白無故多寫很多代碼。

感謝各位的閱讀,以上就是“Python中怎么避免濫用try...except”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Python中怎么避免濫用try...except這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站欄目:Python中怎么避免濫用try...except
本文網(wǎng)址:http://muchs.cn/article2/pjjsoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、ChatGPT、網(wǎng)站排名網(wǎng)站設(shè)計(jì)公司、網(wǎng)站維護(hù)域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作