exception,traceback和sys.exc_info()区别
1.exception
作用:能看到错误提示
def fake_exception():
1 / 0
def catch_exception():
try:
fake_exception()
except Exception as e:
print e # or print e.message
catch_exception()
输出:
integer division or modulo by zero
2.traceback
作用:能看到具体的错误在哪一行
traceback.print_exc()和traceback.format_exc()区别:
- format_exc() 返回异常字符串
- print_exc() 直接打异常给打印出来
所以 traceback.print_exc() 与 print (traceback.format_exc()) 显示效果是一样的。
另外print_exc()还可以接受file参数直接写入到一个文件中。
例如:traceback.print_exc(file=open(‘log.log’, mode=‘a’, encoding=‘utf-8’))将文件写入到了log.log文件中
import traceback
def fake_exception():
1 / 0
def catch_exception():
try:
fake_exception()
except:
traceback.print_exc()
catch_exception()
输出:
Traceback (most recent call last):
File "/Users/edwin/PycharmProjects/testProject/main.py", line 12, in catch_exception
fake_exception()
File "/Users/edwin/PycharmProjects/testProject/main.py", line 8, in fake_exception
1 / 0
ZeroDivisionError: integer division or modulo by zero
3.sys.exc_info
作用:能看到错误类型和错误提示。
返回 一个元组(type, value, traceback),
- type为异常类型
- value是被引发的异常类实例(通常为异常错误的信息)
- traceback是一个跟踪对象,代表异常最初发生时所调用的栈,同时被traceback模块用来产生错误信息。
import sys
def fake_exception():
1 / 0
def catch_exception():
try:
fake_exception()
except:
e_type, e_value, e_traceback = sys.exc_info()
print "type ==> %s" % (e_type.__name__)
print "value ==> %s" %(e_value.message)
print "traceback ==> file name: %s" %(e_traceback.tb_frame.f_code.co_filename)
print "traceback ==> line no: %s" %(e_traceback.tb_lineno)
print "traceback ==> function name: %s" %(e_traceback.tb_frame.f_code.co_name)
catch_exception()
输出:
type ==> ZeroDivisionError
value ==> integer division or modulo by zero
traceback ==> file name: /Users/edwin/PycharmProjects/testProject/main.py
traceback ==> line no: 12
traceback ==> function name: catch_exception
版本差异提示:在python2.x中,旧的工具sys.exc_type()和sys.exc_value()依然可用于获得最近异常的类型和值,但是只能替整个进程管理单个的全局异常。不过,sys.exc_type()和sys.exc_value()在python3.x中已经被移除了。相反,新的推荐使用的sys.exc_info()调用(在python2和python3中都可以使用)会记录每条线程的异常信息,也因此是针对线程的。当然,只有当你在python程序中使用多线程时,这种区别才显得重要,但3.x却强制了这一使用。