一般我们我们想捕获python的异常写入到log,做处理的话,一般用try语句来做处理,大概语法如下:
try:
语句1
语句2
.
.
语句N
except ........ :
do something .......
但是你并不知道"语句1至语句N"哪个会出现什么样的错误,但你还要做异常处理,且想把出现的异常打印出来,并不停止程序的运行,所以在"except ......"语句就起作用了。方法一:捕获所有异常
Python2如下:
try:
语句1
语句2
.....
语句N
except Exception,e:
print Exception,":",e
Python3如下:
try:
语句1
语句2
.....
语句N
except Exception as e:
print(Exception, ":", e)
例子如下:
try:
a = 1
b = a
c = w
except Exception as e:
print(Exception, ":", e)
结果为:
: name 'w' is not defined
方法二:采用sys模块回溯最后的异常sys.exc_info() 会返回一个3值元表,其中包含调用该命令时捕获的异常。这个元表的内容为 (type, value, traceback) ,其中:
type 从获取到的异常中得到类型名称,它是BaseException 的子类;
value 是捕获到的异常实例;
traceback 是一个 traceback 对象,下面会详述。
import sys
try:
w = abs(-1)
list.append(w)
except:
info = sys.exc_info()
print(info[0], ":", info[1])
# 结果如下:
: descriptor 'append' requires a 'list' object but received a 'int'
sys.last_traceback 包含的内容与 sys.exc_info() 相同,但它主要用于调试,并不总是被定义。三、采用traceback模块查看异常trackback 模块用来精确模仿 python3 解析器的 stack trace 行为。在程序中应该尽量使用这个模块。traceback.print_exc() 可以直接打印当前的异常。
import traceback
try:
raise
except:
traceback.print_exc()
traceback.print_tb() 用来打印上面提到的 trackback 对象。
import sys,traceback
try:
raise
except:
t,v,tb = sys.exc_info()
traceback.print_tb(tb)
traceback.print_exception() 可以直接打印 sys.exc_info()提供的元表。
import sys,traceback
try:
raise
except:
traceback.print_exception(*sys.exc_info())
其实,下面两句是等价的:
traceback.print_exc()
traceback.print_exception(*sys.exc_info())
traceback 提供的参数可以将 print 的内容写入到文件中
import traceback
try:
a=b
b=c
except:
f=open("log.txt",'a')
traceback.print_exc(file=f)
f.flush()
f.close()
郭德纲
坚持分享的人最可爱,转起!
我为开源技术社区「带盐」,每天收获一小点,快乐生活一整天!