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
常用方法及其區別
正文測試過程
#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