Python中使用traceback模块捕获并打印异常详解
本文详细介绍Python中利用traceback模块捕获和打印异常的方法。通过对比print_exc与format_exc的区别,演示如何将异常信息直观输出至控制台或写入指定文件,并结合logging模块实现完整的错误日志记录,帮助开发者快速定位代码错误位置。
在Python开发中,异常处理是日常操作。然而,仅仅打印处理结果往往不够,我们需要将具体的异常信息也打印出来,以便更直观地展示错误详情。
接下来介绍如何使用traceback模块来处理异常。
try:
1/0
except Exception, e:
print e
如果仅使用普通的异常捕获,输出结果可能仅显示“integer division or modulo by zero”,虽然知道报错了,但无法得知具体是在哪个文件、哪个函数以及哪一行代码中发生的错误。
为了解决这个问题,我们可以使用traceback模块。
try:
1/0
except Exception, e:
traceback.print_exc()
以下是使用traceback后的输出结果示例。
Traceback (most recent call last):
File "test_traceback.py", line 3, in <module>
1/0
ZeroDivisionError: integer division or modulo by zero
这种输出方式非常直观,极大地有利于代码调试。
那么,traceback.print_exc()与traceback.format_exc()有什么区别呢?
traceback.format_exc()返回的是一个字符串对象,而traceback.print_exc()则直接将异常信息打印到标准输出。
也就是说,traceback.print_exc()的效果等同于print(traceback.format_exc())。
此外,traceback.print_exc()还可以接受file参数,直接将异常信息写入到一个文件中。例如:
traceback.print_exc(file=open('tb.txt','w+'))
上述代码会将异常信息写入到tb.txt文件中。
下面是一个完整的示例。
# -*- coding:utf-8 -*-
import os
import logging
import traceback
#设置log, 这里使用默认log
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='[%Y-%m_%d %H:%M:%S]',
filename=os.path.dirname(os.path.realpath(__file__)) + "/" + 'test.log',
filemode='a')
a=10
b=0 #设置为0, 走异常流程; 否则, 走正常流程
try:
res=a/b
logging.info("exec success, res:" + str(res))
except Exception,e:
#format_exc()返回字符串,print_exc()则直接给打印出来
traceback.print_exc()
logging.warning("exec failed, failed msg:" + traceback.format_exc())
需要注意的是,logging模块默认的打印级别是warning。
通过配置日志格式,我们可以得到如下日志打印效果:
[2017-11_17 07:51:02] trace.py[line:24] WARNING exec failed, failed msg:Traceback (most recent call last):
File "trace.py", line 19, in <module>
res=a/b
ZeroDivisionError: integer division or modulo by zero
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













