這個博文裏代碼片斷的在一個星期前就寫好,但一直沒有發出來。由於專門寫python異常處理的文章不是不少,不知道本身的處理是否是一個比較優秀的實踐,但願看到這個博文的人積極拍板,有什麼異常處理的優秀實踐也一塊兒分享如下。我會持續的更新這篇博文,遇到新的優秀實踐及時記錄。python
1、堅定不能簡單的忽略和隱藏捕獲的異常。code
下面這段代碼是一個反面的例子千萬不能這麼作,這樣只是簡單的吞掉捕獲的異常,這回後續的工做帶來很大的麻煩,可能讓咱們沒法定位到bug在什麼地方。orm
try: do_something() except: #except Exception as e pass
2、儘可能捕捉特定的異常。get
儘可能捕捉特定的異常這也是PEP8的要求。當第一次寫本身的代碼的時候,作這件事是很簡單,不過當清理別人的代碼的時候,這可能變的萬分痛苦。其實我一直在找處理這種狀況的方法,我會在以後發現更好的實踐的時候,來更新博文。有一個方法,把這部分交給那個對這一部分代碼更熟悉的傢伙。哈哈哈io
try: do_something() except ValueError: do_exception_deal()
3、當須要捕獲全部異常的時候,要把相關的堆棧追蹤信息記錄下來不要僅僅記錄一個錯誤信息。form
有些代碼可能要捕獲全部的異常,例如最頂層循環的長時間運行的代碼。下面的代碼提供一個相對不錯的實踐,使用logging或這tarceback記錄異常相關的全部堆棧信息。class
#!/usr/bin/python3 import logging import time import traceback import sys logging.basicConfig(level=logging.INFO) def log_traceback(ex): tb_lines = traceback.format_exception(ex.__class__, ex, ex.__traceback__) tb_text = ''.join(tb_lines) print(tb_text) def get_number(arg): return int(arg) try: get_number("hello") except Exception as e: # logging.exception(e) #使用logging模塊的exception方法去打印tarceback log_traceback(e) #使用traceback模塊去輸出traceback。 for i in range(10): time.sleep(1) logging.info("hello")
使用 # logging.exception(e) 或者 log_traceback(e)記錄全部的異常堆棧信息,對以後的工做是頗有幫組的。import