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