python 上下文處理錯誤,記錄日誌

2021-09-07 19:16:06 字數 1695 閱讀 5002

之前發過了裝飾器版本的異常記錄日誌,但是需要裝飾在函式或方法上。此篇用上下文管理,用乙個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 ...