python異常處理的優秀實踐

        這個博文裏代碼片斷的在一個星期前就寫好,但一直沒有發出來。由於專門寫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

相關文章
相關標籤/搜索