基础操作(python 3)
参考贴
#当results是以下形式的时候,以下代码会出现异常进行异常捕获处理
#results={'status': '0', 'info': 'ENGINE_RESPONSE_DATA_ERROR', 'infocode': '30001'}
#本文处理是捕获异常不处理,写入日志文件
try:
format_address=results["geocodes"][0]["formatted_address"]
except Exception as e:
logging.error(repr(e))
#如果知道自己的程序会报什么异常可以用更具体的方式编写
#这样写的化
try:
format_address=results["geocodes"][0]["formatted_address"]
except KeyError as e:
logging.error(repr(e))
log按日输出到日志文件中
代码
logger=logging.getLogger()
#log 按天打印到文件里
#打印 WARNING 级别以上的代码
logger.setLevel(level=logging.WARNING)
#定义log输出格式为: 2023-03-21 10:35:09,824 - trainsfind.py[line:50] - ERROR: KeyError('geocodes')
format=logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
#按时间区分,生成日志文件
time_FileHandler=logging.handlers.TimedRotatingFileHandler(filename="log//test",when='S',interval=1,)
time_FileHandler.setFormatter(format)
time_FileHandler.setLevel(logging.WARNING)
time_FileHandler.suffix+=".log" #加后缀名
#log 打印到控制台
stream_handler=logging.StreamHandler()
#logger可以有多个handler
logger.addHandler(time_FileHandler)
logger.addHandler(stream_handler)
#如果是在类里执行,可以把以上代码放到 __init__() 里面,然后再方法里用 logging.error() 日志级别可以自定义
logging.error("error")
time.sleep(1)
logging.warning("warn")
效果
如下(为了显示按时间分区效果,我的代码里是按秒分的,正常按天分就行)
一些参数的概念
loglevel
#打印 WARNING 级别以上的代码
logger.setLevel(level=logging.WARNING)
""" 日志级别
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
_levelToName = {
CRITICAL: 'CRITICAL',
ERROR: 'ERROR',
WARNING: 'WARNING',
INFO: 'INFO',
DEBUG: 'DEBUG',
NOTSET: 'NOTSET',
}
"""
handler类型
常用
logging.StreamHandler -> 控制台输出
logging.FileHandler -> 文件输出
logging.handlers.RotatingFileHandler -> 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件
logging.handlers.TimedRotatingFileHandler -> 按照时间自动分割日志文件
trycatch 详细
#encoding:utf-8
import pandas as pd
import logging
import logging.handlers
from logging.handlers import TimedRotatingFileHandler
import time
import traceback
class myException(Exception):
def __init__(self, msg):
self.message = msg
def __str__(self):
return self.message
class exceptionLog:
def __init__(self):
logger=logging.getLogger()
#log 按天打印到文件里
#打印 WARNING 级别以上的代码
logger.setLevel(level=logging.WARNING)
#定义log输出格式为: 2023-03-21 10:35:09,824 - trainsfind.py[line:50] - ERROR: KeyError('geocodes')
format=logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
#按时间区分,生成日志文件
time_FileHandler=logging.handlers.TimedRotatingFileHandler(filename="log//test",when='D',interval=1,)
time_FileHandler.setFormatter(format)
time_FileHandler.setLevel(logging.WARNING)
time_FileHandler.suffix+=".log" #加后缀名
#log 打印到控制台
stream_handler=logging.StreamHandler()
logger.addHandler(time_FileHandler)
logger.addHandler(stream_handler)
# 高德-获取address详细地址与经纬度信息
def _deal_excepiton(self,):
results={'status': '0', 'info': 'ENGINE_RESPONSE_DATA_ERROR', 'infocode': '30001'}
try:
#这里有四个异常,只有第一个异常会被捕获处理,可以一个个注释以下看效果
format_address=results["geocodes"]
raise AttributeError('对象没有这个属性')
raise myException('我定义的异常,抛出')
raise IndexError("序列没有当前索引")
except KeyError as e:
logging.error(repr(e))
print(e)
except Exception as e:
#我选的repr(e),我觉得这个详细程度就够了
print(e.args)
print("================================")
print(str(e))
print("================================")
print(e)
print("================================")
print(repr(e))
print("================================")
print('traceback.print_exc(): ', traceback.print_exc())
print("================================")
print('traceback.format_exc():\n%s' % traceback.format_exc())
return None
if __name__ == '__main__':
exception=exceptionLog()
logging.error("error")
time.sleep(1)
logging.warning("warn")
exception._deal_excepiton()