Python使用技巧--异常的打印


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却强制了这一使用。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM