1. 程式人生 > >Python---logging&try-exception捕捉記錄異常

Python---logging&try-exception捕捉記錄異常

異常捕捉

  程式可能會出現未知或者難以預料的錯誤,這時候需要捕捉異常。異常有很多形式,具體不多說,只是記錄下工作中常用的一種處理流程,不知道是否合理,但是程式可以這麼用。

常見的異常

  常見的異常有ValueError、ZeroDivisionError、UnicodeError等。對於有的異常,我們需要及時捕獲並且反饋,比如用 python做一個簡易的計算器。如果0做分母,則需要告訴使用者。有的為了程式的整體執行,可能只需要記載錯誤,不需要終止所有程式。常見的異常如下:

異常名稱 描述
BaseException 所有異常的基類
SystemExit 直譯器請求退出
KeyboardInterrupt 使用者中斷執行(通常是輸入^C)
Exception 常規錯誤的基類
StopIteration 迭代器沒有更多的值
GeneratorExit 生成器(generator)發生異常來通知退出
StandardError 所有的內建標準異常的基類
ArithmeticError 所有數值計算錯誤的基類
FloatingPointError 浮點計算錯誤
OverflowError 數值運算超出最大限制
ZeroDivisionError 除(或取模)零 (所有資料型別)
AssertionError 斷言語句失敗
AttributeError 物件沒有這個屬性
EOFError 沒有內建輸入,到達EOF 標記
EnvironmentError 作業系統錯誤的基類
IOError 輸入/輸出操作失敗
OSError 作業系統錯誤
WindowsError 系統呼叫失敗
ImportError 匯入模組/物件失敗
LookupError 無效資料查詢的基類
IndexError 序列中沒有此索引(index)
KeyError 對映中沒有這個鍵
MemoryError 記憶體溢位錯誤(對於Python 直譯器不是致命的)
NameError 未宣告/初始化物件 (沒有屬性)
UnboundLocalError 訪問未初始化的本地變數
ReferenceError 弱引用(Weak reference)試圖訪問已經垃圾回收了的物件
RuntimeError 一般的執行時錯誤
NotImplementedError 尚未實現的方法
SyntaxError Python 語法錯誤
IndentationError 縮排錯誤
TabError Tab 和空格混用
SystemError 一般的直譯器系統錯誤
TypeError 對型別無效的操作
ValueError 傳入無效的引數
UnicodeError Unicode 相關的錯誤
UnicodeDecodeError Unicode 解碼時的錯誤
UnicodeEncodeError Unicode 編碼時錯誤
UnicodeTranslateError Unicode 轉換時錯誤
Warning 警告的基類
DeprecationWarning 關於被棄用的特徵的警告
FutureWarning 關於構造將來語義會有改變的警告
OverflowWarning 舊的關於自動提升為長整型(long)的警告
PendingDeprecationWarning 關於特性將會被廢棄的警告
RuntimeWarning 可疑的執行時行為(runtime behavior)的警告
SyntaxWarning 可疑的語法的警告
UserWarning 使用者程式碼生成的警告

異常處理

try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常資訊並處理。具體邏輯如下:

try:
<語句>        #執行別的程式碼
except <名字>:
<語句>        #如果在try部份引發了'name'異常
except <名字>,<資料>:
<語句>        #如果引發了'name'異常,獲得附加的資料
else:
<語句>        #如果沒有異常發生

看一個實際的列子:

try:
    print(1/0)
except ZeroDivisionError as e:
    print("O 不能做分母")
    print("except:",e)
else:
    print("執行成功")
O 不能做分母
except: division by zero

但是有的時候我們並不能預料會發生什麼樣的錯誤,此時可以用except指代所有的錯誤,並且把錯誤寫到日誌中備查

try:
    print(1/0)
except:
    print("程式出現異常")
程式出現異常

日誌

封裝日誌函式

  日誌模組引數比較多,我也沒搞懂。實際用的腳本里封裝好的一個函式,還是可以用的。

def mylog(logname,logpath):
    import logging
    # 建立一個日誌記錄器
    log = logging.getLogger("test_logger")
    log.setLevel(logging.INFO)
    # 建立一個日誌處理器
    ## 這裡需要正確填寫路徑和檔名,拼成一個字串,最終生成一個log檔案
    logHandler = logging.FileHandler(filename = logpath+"RiskControlDebugging_"+logname+".log")
    ## 設定日誌級別
    logHandler.setLevel(logging.INFO)
    # 建立一個日誌格式器
    formats = logging.Formatter('%(asctime)s %(levelname)s: %(message)s',
                datefmt='[%Y/%m/%d %I:%M:%S]')

    # 將日誌格式器新增到日誌處理器中
    logHandler.setFormatter(formats)
    # 將日誌處理器新增到日誌記錄器中
    log.addHandler(logHandler)
    return log

利用日誌捕捉異常

import os
logname = 'test';logpath = os.getcwd()+"\\"
logger=mylog(logname,logpath)
import sys
try:
    print(1/0)
except:
    logger.exception(sys.exc_info())
    logger.info("Error in dbconfig_file")
f=open('RiskControlDebugging_test.log','r')
print(f.read())
[2018/03/25 05:18:30] ERROR: (<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero',), <traceback object at 0x0000000006EDC5C8>)
Traceback (most recent call last):
  File "<ipython-input-4-f4be39498d99>", line 6, in <module>
    print(1/0)
ZeroDivisionError: division by zero
[2018/03/25 05:18:30] INFO: Error in dbconfig_file

  目前使用的大概是這個形式,直接看文件對我來說還是有點難,所以基本都是看二次加工的,即別人寫的部落格,希望可以早日擁有直接看文件的能力。
                        2018-03-25 於杭州