日志/异常处理(nnlog+traceback)
一、nnlog日志模块,使用之前,需要先pip安装下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 2 3 | 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()进去看看实现 |
例一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 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 |
注:可以看出,三种方式打印结果是一样的。在开发时,做调试是很方便的。也可以把这种异常栈写入日志
例二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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时总会执行
例一:
1 2 3 4 5 6 7 8 9 10 11 12 | d = {} try : print (d[ 'name' ]) except Exception as e: print ( "出异常了" ,e) else : print ( "不出异常的时候走到这里" ) finally : print ( "不管什么时候都会走这里呢" ) 运行结果: 出异常了 'name' 不管什么时候都会走这里呢 |
例二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | d = { 'name' : 'MLing' } try : print (d[ 'name' ]) except Exception as e: print ( "出异常了" ,e) else : print ( "不出异常的时候走到这里" ) finally : print ( "不管什么时候都会走这里呢" ) 运行结果: MLing 不出异常的时候走到这里 不管什么时候都会走这里呢 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)