之前發過了裝飾器版本的異常記錄日誌,但是需要裝飾在函式或方法上。此篇用上下文管理,用乙個with就能記錄錯誤了,不需要寫成函式。
import計算整形和字串相加,執行結果是這樣:traceback
#pip install multiprocessing_log_manager
from multiprocessing_log_manager import
logmanager
class
exceptioncontextmanager():
"""用上下文管理器捕獲異常,可對**片段進行錯誤捕捉,比裝飾器更細膩
"""def
__init__(self, logger_name='
exceptioncontextmanager
', verbose=100, donot_raise__exception=true, ):
""":param _verbose: 列印錯誤的深度,對應traceback物件的limit,為正整數
:param donot_raise__exception:是否不重新丟擲錯誤,為fasle則丟擲,為true則不丟擲
"""self.logger =logmanager(logger_name).get_logger_and_add_handlers()
self._verbose =verbose
self._donot_raise__exception =donot_raise__exception
def__enter__
(self):
return
self
def__exit__
(self, exc_type, exc_val, exc_tb):
#print(exc_val)
#print(traceback.format_exc())
exc_str = str(exc_type) + '
: ' +str(exc_val)
exc_str_color = '
\033[0;30;45m%s\033[0m
' %exc_str
ifself._donot_raise__exception:
self.logger.error('\n
'.join(traceback.format_tb(exc_tb)[:self._verbose]) +exc_str_color)
return self._donot_raise__exception #
__exit__方法必須retuen true才會不重新丟擲錯誤
if__name__ == '
__main__':
deff1():
1 + '2'
deff2():
f1()
deff3():
f2()
deff4():
f3()
defrun():
f4()
with exceptioncontextmanager() as ec:
run()
print('finish')
可以傳verbose引數來控制記錄錯誤的深度,預設寫了100
python上下文管理
重寫 enter 方法,返回值會被 as 捕獲 重寫 exit 方法 democlass mycontextmanager def enter self print 進入管理器範圍執行方法 此處的返回值會被 with xx as 捕獲 return 退出上下文管理範圍執行方法,即使中間報錯也會執行 ...
Python錯誤記錄
第一種 str hello world print str 20 indexerror string index out of range 索引錯誤 字串超出範圍 解決方法 索引小於字串的長度 print str 4 o 第二種 list a b c d e print list 20 indexe...
python 高階 with 上下文管理
with 上下文管理器 語法糖 python 提供的一種簡化語法,在編寫 時更加簡潔 with 就是眾多語法糖中的一種 with 執行原理 能通過with進行執行的語句,都是實現了上下文管理器 上下文管理器中包含兩個魔法方法 enter 和 exit enter 方法提供環境的初始化操作 exit ...