Python---logging&try-exception捕捉記錄異常
阿新 • • 發佈:2019-01-24
異常捕捉
程式可能會出現未知或者難以預料的錯誤,這時候需要捕捉異常。異常有很多形式,具體不多說,只是記錄下工作中常用的一種處理流程,不知道是否合理,但是程式可以這麼用。
常見的異常
常見的異常有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 於杭州