偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

脫離苦海,從避免濫用try...except...開(kāi)始

開(kāi)發(fā) 后端
有不少人在寫(xiě) Python 代碼時(shí),喜歡用 try...except Exception,根本不管是否有必要,總之套上了try...except...就有了安全感。如果你飽受濫用try...except...之苦,下面三個(gè)方法可以讓你脫離苦海。

[[324472]]

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

    ss="dp-xml">
  1. ss="alt">def func(): 
  2. ss="">    try: 
  3. ss="alt">        "函數(shù)內(nèi)部代碼" 
  4. ss="">    except Exception as e: 
  5. ss="alt">        print('函數(shù)錯(cuò)誤:', e) 
  6. ss=""> 
  7. ss="alt"> 
  8. ss="">try: 
  9. ss="alt">    func() 
  10. ss="">except Exception as e: 
  11. ss="alt">    print('函數(shù)錯(cuò)誤:', e) 

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

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

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

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

把問(wèn)題暴露出來(lái)

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

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

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

    ss="dp-xml">
  1. ss="alt">def query_name(user_id): 
  2. ss="">    if not isinstance(user_id, int): 
  3. ss="alt">        return {'success': False, 'msg': '用戶 id 必須是整型'} 
  4. ss="">    ... 

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

    ss="dp-xml">
  1. ss="alt">def query_name(user_id): 
  2. ss="">    if not isinstance(user_id, int): 
  3. ss="alt">        raise Exception('用戶 id 必須是整型'} 
  4. ss="">    ... 

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

    ss="dp-xml">
  1. ss="alt">def query_name(user_id): 
  2. ss="">    assert isinstance(user_id, int), '用戶 id 必須是整型' 
  3. ss="alt">    ... 

如下圖所示:

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

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

盡量早地讓異常暴露出來(lái),才能更早地解決問(wèn)題。

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

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

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

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

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

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

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

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

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

它的用法非常簡(jiǎn)單:

    ss="dp-xml">
  1. ss="alt">import traceback 
  2. ss=""> 
  3. ss="alt">try: 
  4. ss="">    1 + 'a' 
  5. ss="alt">except Exception: 
  6. ss="">    print(traceback.format_exc()) 

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

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

總結(jié)try...except...會(huì)讓你的代碼看起來(lái)沒(méi)有問(wèn)題,但也有可能會(huì)掩蓋問(wèn)題,讓你無(wú)法發(fā)現(xiàn)哪里有問(wèn)題。所以,從看了這篇文章開(kāi)始,刪除不必要的try...except...。

擁抱異常,讓你無(wú)法處理的異常拋出來(lái)。程序出現(xiàn)了問(wèn)題應(yīng)該停止運(yùn)行,而不是帶著問(wèn)題繼續(xù)運(yùn)行,這樣可能會(huì)演變成更大的問(wèn)題。

 

責(zé)任編輯:趙寧寧 來(lái)源: 未聞Code
相關(guān)推薦

2021-02-25 09:35:32

語(yǔ)句elsePython

2025-02-17 06:00:00

Task.Run.NET開(kāi)發(fā)

2021-03-29 12:18:07

thisdata前端

2020-07-27 10:03:03

蘋(píng)果數(shù)據(jù)開(kāi)發(fā)者

2011-10-09 13:35:58

Linux集群STONITH服務(wù)器

2010-03-10 14:34:52

Python異常處理

2009-07-08 18:28:57

惠普刀片刀片服務(wù)器

2017-08-12 09:11:44

IT首席信息官采購(gòu)

2011-12-03 11:04:21

SSL VPN移動(dòng)設(shè)備

2019-07-02 16:57:20

混合云技術(shù)Linux

2009-06-03 15:14:04

SOA應(yīng)用耦合

2016-08-05 14:48:00

javascripthtml前端

2023-05-23 08:01:10

Netty網(wǎng)絡(luò)通信

2024-10-17 08:05:51

2011-09-10 21:05:04

密碼管理瀏覽器插件

2021-08-06 09:30:34

人工智能AI人臉識(shí)別

2013-03-21 17:42:35

2009-12-02 18:45:53

Linux新手

2011-04-12 13:43:17

布線

2014-12-03 13:26:24

JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)