1.目的
在java中,我们经常会有统一异常处理以及日志打印模块,同样,python也是,在yolo中很多位置就是用到了这个,比如校验图片的尺寸,后缀名,设备状态等等…
2.python异常处理办法
2.1直接打印异常信息
except中直接print
2.2打印异常具体位置
traceback.print_exec()
3.日志处理
3.1代码
"""
@Time : 2024/9/1 上午8:52
@Author : chensong
@File : 1.python异常处理以及日志打印.py
@Desc :
"""
import logging
import sys
import traceback
import warnings
import cv2
class customerHandler(logging.FileHandler):
# mode: a:追加 w:覆盖
def __init__(self, filename,mode='a',encoding=None,delay=False):
super().__init__(filename,mode,encoding,delay)
# 在此处重写原有方法,比如改变日志记录的格式或者行为
def emit(self, record):
print('重写了FileHandler类')
formatted_record = self.format(record)
with open(self.baseFilename,'a') as log_file:
log_file.write(formatted_record +'\n')
if __name__ == '__main__':
# 定义一个logger
# 形参为一个str,指定logger名称,不指定则代表是根logger
mylogger = logging.getLogger('mylogger')
# 设置日志级别,debug属于最低级别日志,所以所有的日志信息都将被打印
mylogger.setLevel(logging.DEBUG)
# 定义不同的handler可以将日志输出到不同的地方
# filehandler,streamhandler,sockethandler,smpthandler
# 下方的handler是将日志输出到控制台
myHandler = customerHandler('my_logFile.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
myHandler.setFormatter(formatter)
mylogger.addHandler(myHandler)
mylogger.info('这是自定义的handler处理日志信息')
# 2.定义第二个handler
logger2 = logging.getLogger('secondLogger')
streamHandler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
streamHandler.setFormatter(formatter)
logger2.addHandler(streamHandler)
try:
# a = 1/0
warnings.warn('a',DeprecationWarning)
with warnings.catch_warnings():
mylogger.warning('a')
cv2.imshow('www')
except Exception as e:
# 只有error才会到达这里
traceback.print_exc()
print('开始打印异常原因')
# 记录异常及其级别
exc_info = sys.exc_info()
# 到达这里就会出现错误
mylogger.error(exc_info)
# 使用完以后移除对应handler
mylogger.removeHandler(myHandler)
logger2.removeHandler(streamHandler)