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卻強制了這一使用。