traceback異常打印


traceback模塊

traceback模塊被用來跟蹤異常返回信息. 如下例所示:

import traceback
try:
    raise SyntaxError, "traceback test"
except:
    traceback.print_exc()

 將會在控制台輸出類似結果:

Traceback (most recent call last):
  File "H:PythonWorkSpaceTestsrcTracebackTest.py", line 3, in <module>
    raise SyntaxError, "traceback test"
SyntaxError: traceback test

類似在你沒有捕獲異常時候, 解釋器所返回的結果.

你也可以傳入一個文件, 把返回信息寫到文件中去, 如下:

import traceback
import StringIO
try:
    raise SyntaxError, "traceback test"
except:
    fp = StringIO.StringIO()    #創建內存文件對象
    traceback.print_exc(file=fp)
    message = fp.getvalue()
    print message

常用方法及其區別

問題: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('tb.txt','w+'))
寫入到tb.txt文件去。

正文測試過程

#sys.exc_info()
返回 (type, value, traceback). type為異常類型, value為異常的參數(通常為異常錯誤的信息), traceback為跟蹤回溯的對象.

    exc_type, exc_value, exc_traceback = sys.exc_info()
    print "*** print sys.exc_info:" print 'exc_type is: %s, exc_value is: %s, exc_traceback is: %s' % (exc_type, exc_value, exc_traceback)

輸出:

*** print sys.exc_info:
exc_type is: <type 'exceptions.IndexError'>, exc_value is: tuple index out of range, exc_traceback is: <traceback object at 0x7fee3b00eb48>

traceback.print_tb(traceback[, limit[, file]])

打印棧的跟蹤信息. 如果省略limit, 將打印所有跟蹤入口信息. file默認為std.err.

import traceback
import sys

def traceback_test():
    try:
        raise SyntaxError, 'traceback_test'
    except Exception as e:
        traceback.print_tb(e, limit=1, file=sys.stdout)

if __name__ == '__main__':
    traceback_test()

 錯誤信息

Traceback (most recent call last):
  File "D:/MH_code/test_flask_project/app/traceback.py", line 14, in <module>
    traceback_test()
  File "D:/MH_code/test_flask_project/app/traceback.py", line 11, in traceback_test
    traceback.print_tb(e, limit=1, file=sys.stdout)
  File "C:\Python27\lib\traceback.py", line 61, in print_tb
    f = tb.tb_frame
AttributeError: 'exceptions.SyntaxError' object has no attribute 'tb_frame'

traceback.print_exception(type, value, traceback[, limit[, file]])

打印異常信息. (type, value, traceback)為sys.exc_info()返回的元組.和print_tb不同的是:
- 如果traceback不為空, 打印棧頭信息(即最近被調用的信息).
- 在棧的信息后打印異常類型和參數.
- 如果是語法錯誤, 會打印對應的代碼行數, 用”^”指明語法錯誤的位置.

import traceback
import sys

def traceback_test():
    try:
        raise SyntaxError, 'traceback_test'
    except Exception as e:
     exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout) if __name__ == '__main__': traceback_test()

 錯誤信息

None(用的2.7,打印的什么玩意沒細究)

traceback.print_exc([limit[, file]])

print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback, limit, file)的簡寫

import traceback
import sys

def traceback_test():
    try:
        raise SyntaxError, 'traceback_test'
    except Exception as e:
        traceback.print_exc()

if __name__ == '__main__':
    traceback_test()

 錯誤信息

Traceback (most recent call last):
  File "D:/MH_code/test_flask_project/app/traceback.py", line 11, in traceback_test
    raise SyntaxError, 'traceback_test'
SyntaxError: traceback_test

traceback.format_exc([limit])

類似於print_exc(limit), 但是返回字符串而不是輸出到file.

import traceback
import sys

def traceback_test():
    try:
        raise SyntaxError, 'traceback_test'
    except Exception as e:
        formatted_lines = traceback.format_exc().splitlines()
        print formatted_lines[0]
        print formatted_lines[-1]
if __name__ == '__main__':
    traceback_test()

 錯誤信息

Traceback (most recent call last):
SyntaxError: traceback_test

traceback.format_exception(type, value, tb[, limit])

格式化棧信息和異常信息. 返回一個列表, 包括代碼文件和代碼行, 以及異常信息.

import traceback
import sys

def traceback_test():
    try:
        raise SyntaxError, 'traceback_test'
    except Exception as e:
   exc_type, exc_value, exc_traceback = sys.exc_info() print repr(traceback.format_exception(exc_type, exc_value, exc_traceback)) if __name__ == '__main__': traceback_test()

 錯誤信息

['None\n']

traceback.extract_tb(traceback[, limit])

返回一個跟蹤對象(traceback)的元組列表. 元組內容為(filename, line number, function name, text).

import traceback
import sys

def traceback_test():
    try:
        raise SyntaxError, 'traceback_test'
    except Exception as e:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        print repr(traceback.extract_tb(exc_traceback))
if __name__ == '__main__':
    traceback_test()

 錯誤信息

[('D:/MH_code/test_flask_project/app/traceback.py', 11, 'traceback_test', "raise SyntaxError, 'traceback_test'")]

traceback.extract_stack([f[, limit]])

返回當前棧幀的原始跟蹤(traceback)對象的信息, 格式和extract_tb一樣, 元組內容為(filename, line number, function name, text).

import traceback
import sys

def traceback_test():
    try:
        raise SyntaxError, 'traceback_test'
    except Exception as e:
        print traceback.extract_stack()
if __name__ == '__main__':
    traceback_test()

 輸出

[('D:/MH_code/test_flask_project/app/traceback.py', 22, '<module>', 'traceback_test()'),
 ('D:/MH_code/test_flask_project/app/traceback.py', 20, 'traceback_test', 'print 
traceback.extract_stack()')]

traceback.format_list(list)

按照list對應的項, 返回一個元組列表, 形式為同extract_tb()或者extract_stack()返回的一樣. 元組內容為(filename, line number, function name, text)
將extract_tb()或者extract_stack()返回的list進行格式化.

traceback.format_tb(tb[, limit])

format_list(extract_tb(tb, limit))的簡寫.

traceback.format_stack([f[, limit]])

format_list(extract_stack(f, limit))的簡寫

traceback.tb_lineno(tb)

返回traceback對象設置的行數

 

參考:http://ydoing.iteye.com/blog/2248238

參考:http://blog.csdn.net/handsomekang/article/details/9373035

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM