日志/异常处理(nnlog+traceback)
一、nnlog日志模块,使用之前,需要先pip安装下
import nnlog import traceback log=nnlog.Logger('python.log',level='debug',when='D',backCount=5) # when D是每天 M每月 S每秒 # 日志级别 log.debug('debug数据') #打印的调试信息,是最详细的,比较占用资源,生产环境很少用 log.info('详细信息') #打印一些需要的提示信息 log.warning('警告数据') #出现警告,只打印warning级别的日志 log.error('错误信息') #出现错误 # log.surprise() traceback.format_exc() #拿到出错的信息,放在日志文件里面 traceback.print_exc() #只在执行时pring出错误信息 运行结果: 2020-05-26 18:42:18,625 - D:/NiuTest/MLingTest/day6(数据库操作)/写日志.py[line:6] - DEBUG: debug数据 2020-05-26 18:42:18,626 - D:/NiuTest/MLingTest/day6(数据库操作)/写日志.py[line:7] - INFO: 详细信息 2020-05-26 18:42:18,626 - D:/NiuTest/MLingTest/day6(数据库操作)/写日志.py[line:8] - WARNING: 警告数据 2020-05-26 18:42:18,626 - D:/NiuTest/MLingTest/day6(数据库操作)/写日志.py[line:9] - ERROR: 错误信息 NoneType
注:会在当前目录下生成一个python.log文件,记录运行的内容如下:
二、traceback模块
1、traceback.print_exc()
2、traceback.format_exc()
3、traceback.print_exception()
1、print_exc():是对异常栈输出 2、format_exc():是把异常栈以字符串的形式返回,print(traceback.format_exc()) 就相当于traceback.print_exc() 3、print_exception():traceback.print_exc()实现方式就是traceback.print_exception(sys.exc_info()),可以点sys.exc_info()进去看看实现
例一:
if __name__ == '__main__': import sys import time import traceback try: function(1, 0) except Exception as e: print('***1', type(e), e, '***1') time.sleep(2) print("1***traceback.print_exc():*** 1") time.sleep(1) traceback.print_exc() time.sleep(2) print("2***traceback.format_exc():***2 ") time.sleep(1) print(traceback.format_exc()) time.sleep(2) print("3***traceback.print_exception():***3 ") time.sleep(1) traceback.print_exception(*sys.exc_info()) 运行结果: ***1 <class 'NameError'> name 'function' is not defined ***1 1***traceback.print_exc():*** 1 Traceback (most recent call last): File "D:/NiuTest/NiuTest/day6/day6/写日志.py", line 18, in <module> function(1, 0) NameError: name 'function' is not defined 2***traceback.format_exc():***2 Traceback (most recent call last): File "D:/NiuTest/NiuTest/day6/day6/写日志.py", line 18, in <module> function(1, 0) NameError: name 'function' is not defined 3***traceback.print_exception():***3 Traceback (most recent call last): File "D:/NiuTest/NiuTest/day6/day6/写日志.py", line 18, in <module> function(1, 0) NameError: name 'function' is not defined Process finished with exit code 0
注:可以看出,三种方式打印结果是一样的。在开发时,做调试是很方便的。也可以把这种异常栈写入日志
例二:
import pymysql import nnlog import traceback log = nnlog.Logger('python.log',level='debug',backCount=5,when='D') mysql_info = { 'host':'****', 'port':3306, 'db':'jxz', 'password':'123456', 'charset':'utf8', 'autocommit':True, 'user':'jxz' } name='xiaohei' sql=sql = 'select * from product where4 name="%s";' % name def op_db(sql,one_tag=True): try: log.debug("开始连接数据库,数据库连接信息是%s"%mysql_info) connect = pymysql.connect(**mysql_info) except Exception as e: log.debug("连接数据失败") log.error("连接数据失败,请检查") log.error(traceback.format_exc()) # traceback.format_exc()拿到出错的那一大坨字符串 #traceback.print_exc()#只print错误信息 return "001" else: log.info("开始建立游标") cur = connect.cursor(pymysql.cursors.DictCursor) try: log.error("开始执行sql") log.info("sql语句是%s"%sql) cur.execute(sql) except Exception as e: print(e) log.warning(traceback.format_exc()) log.warning("sql错误!") return "002" else: if one_tag: result = cur.fetchone()#{} else: result = cur.fetchall()#[] finally: cur.close() connect.close() return result op_db(sql) 运行结果: 会生成一个python.log文件,记录日志信息
log内容如下:
三、异常处理
使用格式如下:
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
finally:
<语句> #退出try时总会执行
例一:
d = {} try: print(d['name']) except Exception as e: print("出异常了",e) else: print("不出异常的时候走到这里") finally: print("不管什么时候都会走这里呢") 运行结果: 出异常了 'name' 不管什么时候都会走这里呢
例二:
d = {'name':'MLing'} try: print(d['name']) except Exception as e: print("出异常了",e) else: print("不出异常的时候走到这里") finally: print("不管什么时候都会走这里呢") 运行结果: MLing 不出异常的时候走到这里 不管什么时候都会走这里呢