<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          別再亂用 try except 了...

          共 1893字,需瀏覽 4分鐘

           ·

          2020-05-09 23:20


          閱讀本文大概需要 3 分鐘。


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

          def?func():
          ????try:
          ????????"函數(shù)內(nèi)部代碼"
          ????except?Exception?as?e:
          ????????print('函數(shù)錯誤:',?e)


          try:
          ????func()
          except?Exception?as?e:
          ????print('函數(shù)錯誤:',?e)

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

          俄羅斯套娃套多了以后,噩夢開始了。我們來看看下面這段報錯:

          d785eda389fd9258be61a07633e567ce.webp

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

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

          把問題暴露出來

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

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

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

          def?query_name(user_id):
          ????if?not?isinstance(user_id,?int):
          ????????return?{'success':?False,?'msg':?'用戶 id 必須是整型'}
          ????...

          但實際上,更好的做法是,直接拋出一個異常:

          def?query_name(user_id):
          ????if?not?isinstance(user_id,?int):
          ????????raise?Exception('用戶 id 必須是整型'}
          ????...

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

          def?query_name(user_id):
          ????assert?isinstance(user_id,?int),?'用戶?id?必須是整型'
          ????...

          如下圖所示:

          c8cee258eaacc3c7f9a9d305b1463656.webp

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

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

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

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

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

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

          af0bea51c0a6160bdb99f612dec7805d.webp

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

          c97774f5276259bd6ded93a5476fb1c6.webp

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

          df1fdd189ec346ed52e12d90cb1a8671.webp

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

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

          強行打印報錯信息

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

          它的用法非常簡單:

          import?traceback

          try:
          ????1?+?'a'
          except?Exception:
          ????print(traceback.format_exc())

          運行效果如下圖所示:

          4102659bfb756989a157b527784f0671.webp

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

          總結(jié)

          try...except...會讓你的代碼看起來沒有問題,但也有可能會掩蓋問題,讓你無法發(fā)現(xiàn)哪里有問題。所以,從看了這篇文章開始,刪除不必要的try...except...

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


          好文和朋友一起看~
          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲综合成人视频 | 人妻视频导航 | 精精品人妻一区二区三区 | 在线黄色亚洲视频 | 中文字幕国产专区 |