新聞中心
traceback —— 打印或讀取堆棧的跟蹤信息
源代碼: Lib/traceback.py

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,慈利企業(yè)網(wǎng)站建設,慈利品牌網(wǎng)站建設,網(wǎng)站定制,慈利網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,慈利網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
該模塊提供了一個標準接口來提取、格式化和打印 python 程序的堆棧跟蹤結(jié)果。它完全模仿Python 解釋器在打印堆棧跟蹤結(jié)果時的行為。當您想要在程序控制下打印堆棧跟蹤結(jié)果時,例如在“封裝”解釋器時,這是非常有用的。
這個模塊使用 traceback 對象 —— 這是存儲在 sys.last_traceback 中的對象類型變量,并作為 sys.exc_info() 的第三項被返回。
這個模塊定義了以下函數(shù):
traceback.print_tb(tb, limit=None, file=None)
如果*limit*是正整數(shù),那么從 traceback 對象 “tb” 輸出最高 limit 個(從調(diào)用函數(shù)開始的)棧的堆?;厮?條目?;如果 limit 是負數(shù)就輸出 abs(limit) 個回溯條目;又如果 limit 被省略或者為 None,那么就會輸出所有回溯條目。如果 file 被省略或為 None 那么就會輸出至標準輸出``sys.stderr``否則它應該是一個打開的文件或者文件類對象來接收輸出
在 3.5 版更改: 添加了對負數(shù)值 limit 的支持
traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True)
打印回溯對象 tb 到 file 的異常信息和整個堆?;厮?。這和 print_tb() 比有以下方面不同:
-
如果 tb 不為
None,它將打印頭部Traceback (most recent call last): -
它將在?;厮葜蟠蛴‘惓n愋秃?value
-
如果 type(value) 為 SyntaxError 且 value 具有適當?shù)母袷剑鼤蛴“l(fā)生語法錯誤的行并用一個圓點來指明錯誤的大致位置。
從 Python 3.10 開始,可以不再傳遞 value 和 tb,而是傳遞一個異常對象作為第一個參數(shù)。 如果提供了 value 和 tb,則第一個參數(shù)會被忽略以便提供向下兼容性。
可選的 limit 參數(shù)具有與 print_tb() 的相同含義。 如果 chain 為真值(默認),則鏈式異常(異常的 __cause__ 或 __context__ 屬性)也將被打印出來,就像解釋器本身在打印未處理的異常時一樣。
在 3.5 版更改: etype 參數(shù)會被忽略并根據(jù) value 推斷出來。
在 3.10 版更改: etype 形參已被重命名為 exc 并且現(xiàn)在是僅限位置形參。
traceback.print_exc(limit=None, file=None, chain=True)
這是 print_exception(*sys.exc_info(), limit, file, chain) 的簡寫。
traceback.print_last(limit=None, file=None, chain=True)
這是 print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file, chain) 的簡寫。 通常它將只在異常到達交互提示之后才會起作用 (參見 sys.last_type)。
traceback.print_stack(f=None, limit=None, file=None)
如果 limit 為正數(shù)則打印至多 limit 個棧回溯條目(從發(fā)起調(diào)用點開始)。 在其他情況下,則打印最后 abs(limit) 個條目。 如果 limit 被省略或為 None,則會打印所有條目。 可選的 f 參數(shù)可被用來指明一個用于開始的替代棧。 可選的 file 參數(shù)具有與 print_tb() 的相同含義。
在 3.5 版更改: 添加了對負數(shù)值 limit 的支持
traceback.extract_tb(tb, limit=None)
返回一個 StackSummary 對象來代表從回溯對象 tb 提取的 “預處理” 棧回溯條目列表。 它適用于?;厮莸奶娲袷交?。 可選的 limit 參數(shù)具有與 print_tb() 的相同含義。 “預處理” ?;厮輻l目是一個 FrameSummary 對象,其中包含代表通常為?;厮荽蛴〉男畔⒌?filename, lineno, name 和 line 等屬性。 line 是一個去除了前導和末尾空白符的字符串;如果源代碼不可用則它將為 None。
traceback.extract_stack(f=None, limit=None)
從當前的棧幀提取原始回溯信息。 返回值具有與 extract_tb() 的相同格式。 可選的 f 和 limit 參數(shù)具有與 print_stack() 的相同含義。
traceback.format_list(extracted_list)
給定一個由元組或如 extract_tb() 或 extract_stack() 所返回的 FrameSummary 對象組成的列表,返回一個可打印的字符串列表。 結(jié)果列表中的每個字符串都對應于參數(shù)列表中具有相同索引號的條目。 每個字符串以一個換行符結(jié)束;對于那些源文本行不為 None 的條目,字符串也可能包含內(nèi)部換行符。
traceback.format_exception_only(exc, /[, value])
使用 sys.last_value 等給出的異常值來格式化回溯中的異常部分。 返回值是一個字符串的列表,每個字符串都以換行符結(jié)束。 通常,此列表只包含單個字符串;但是,對于 SyntaxError 異常,它將包含多行并且(當打印時)會顯示有關語法錯誤在何處發(fā)生的詳細信息。 指明發(fā)生了哪種異常的消息將總是該列表中的最后一個字符串。
從 Python 3.10 開始,可以不傳入 value,而是傳入一個異常對象作為第一個參數(shù)。 如果提供了 value,則第一個參數(shù)將被忽略以便提供向下兼容性。
在 3.10 版更改: etype 形參已被重命名為 exc 并且現(xiàn)在是僅限位置形參。
traceback.format_exception(exc, /, [value, tb, ]limit=None, chain=True)
格式化一個棧跟蹤和異常信息。 參數(shù)的含義與傳給 print_exception() 的相應參數(shù)相同。 返回值是一個字符串列表,每個字符串都以一個換行符結(jié)束且有些還包含內(nèi)部換行符。 當這些行被拼接并打印時,打印的文本與 print_exception() 的完全相同。
在 3.5 版更改: etype 參數(shù)會被忽略并根據(jù) value 推斷出來。
在 3.10 版更改: 此函數(shù)的行為和簽名已被修改以與 print_exception() 相匹配。
traceback.format_exc(limit=None, chain=True)
這類似于 print_exc(limit) 但會返回一個字符串而不是打印到一個文件。
traceback.format_tb(tb, limit=None)
是 format_list(extract_tb(tb, limit)) 的簡寫形式。
traceback.format_stack(f=None, limit=None)
是 format_list(extract_stack(f, limit)) 的簡寫形式。
traceback.clear_frames(tb)
通過調(diào)用每個幀對象的 clear() 方法來清除回溯 tb 中所有棧幀的局部變量。
3.4 新版功能.
traceback.walk_stack(f)
從給定的幀開始訪問 f.f_back 之后的棧,產(chǎn)生每一幀的幀和行號。 如果 f 為 None,則會使用當前棧。 這個輔助函數(shù)要與 StackSummary.extract() 一起使用。
3.5 新版功能.
traceback.walk_tb(tb)
訪問 tb_next 之后的回溯并產(chǎn)生每一幀的幀和行號。 這個輔助函數(shù)要與 StackSummary.extract() 一起使用。
3.5 新版功能.
此模塊還定義了以下的類:
TracebackException 對象
3.5 新版功能.
TracebackException 對象基于實際的異常創(chuàng)建通過輕量的方式捕獲數(shù)據(jù)以便隨后打印。
class traceback.TracebackException(exc_type, exc_value, exc_traceback, **, limit=None, lookup_lines=True, capture_locals=False, compact=False*)
捕獲一個異常以便隨后渲染。 limit, lookup_lines 和 capture_locals 的含義與 StackSummary 類的相同。
如果 compact 為真值,則只有 TracebackException 的 format 方法所需要的數(shù)據(jù)會被保存在類屬性中。 特別地,__context__ 字段只有在 __cause__ 為 None 且 __suppress_context__ 為假值時才會被計算。
請注意當局部變量被捕獲時,它們也會被顯示在回溯中。
-
__cause__
原始
__cause__的 TracebackException。 -
__context__
原始
__context__的 TracebackException。 -
__suppress_context__
來自原始異常的
__suppress_context__。 -
__notes__
The
__notes__value from the original exception, orNoneif the exception does not have any notes. If it is notNoneis it formatted in the traceback after the exception string.3.11 新版功能.
-
stack
代表回溯的 StackSummary。
-
exc_type
原始回溯的類。
-
filename
針對語法錯誤 —— 錯誤發(fā)生所在的文件名。
-
lineno
針對語法錯誤 —— 錯誤發(fā)生所在的行號。
-
text
針對語法錯誤 —— 錯誤發(fā)生所在的文本。
-
offset
針對語法錯誤 —— 錯誤發(fā)生所在的文本內(nèi)部的偏移量。
-
msg
針對語法錯誤 —— 編譯器錯誤消息。
-
classmethod from_exception(exc, **, limit=None, lookup_lines=True, capture_locals=False*)
捕獲一個異常以便隨后渲染。 limit, lookup_lines 和 capture_locals 的含義與 StackSummary 類的相同。
請注意當局部變量被捕獲時,它們也會被顯示在回溯中。
-
print(**, file=None, chain=True*)
Print to file (default
sys.stderr) the exception information returned by format().3.11 新版功能.
-
format(**, chain=True*)
格式化異常。
如果 chain 不為
True,則__cause__和__context__將不會被格式化。返回值是一個字符串的生成器,其中每個字符串都以換行符結(jié)束并且有些還會包含內(nèi)部換行符。 print_exception() 是此方法的一個包裝器,它只是將這些行打印到一個文件。
指明發(fā)生了哪種異常的消息總會是輸出中的最后一個字符串。
-
format_exception_only()
格式化回溯的異常部分。
返回值是一個字符串的生成器,每個字符串都以一個換行符結(jié)束。
通常,生成器會發(fā)出單個字符串;不過,對于 SyntaxError 異常,它會發(fā)出(當打印時)顯示有關語法錯誤發(fā)生在何處的詳細信息的多個行。
指明發(fā)生了哪種異常的消息總會是輸出中的最后一個字符串。
在 3.10 版更改: 增加了 compact 形參。
StackSummary 對象
3.5 新版功能.
代表一個可被格式化的調(diào)用棧的 StackSummary 對象。
class traceback.StackSummary
-
classmethod extract(frame_gen, **, limit=None, lookup_lines=True, capture_locals=False*)
構造一個來自幀生成器的 StackSummary 對象(如 walk_stack() 或 walk_tb() 所返回的一樣)。
如果提供了 limit,則只從 frame_gen 提取指定數(shù)量的幀。 如果 lookup_lines 為
False,則返回的 FrameSummary 對象將不會讀入它們的行,這使得創(chuàng)建 StackSummary 的開銷更低(如果它不會被實際格式化這就會很有價值)。 如果 capture_locals 為True則每個 FrameSummary 中的局部變量會被捕獲為對象表示形式。 -
classmethod from_list(a_list)
從所提供的 FrameSummary 對象列表或舊式的元組列表構造一個 StackSummary 對象。 每個元組都應當是以文件、行號、名稱和行為元素的 4 元組。
-
format()
返回一個可打印的字符串列表。 結(jié)果列表中的每個字符串各自對應來自于棧的單獨幀。 每個字符串都以一個換行符結(jié)束;對于帶有源文本行的條目來說,字符串還可能包含內(nèi)部換行符。
對于同一幀與行的長序列,將顯示前幾個重復項,后面跟一個指明之后的實際重復次數(shù)的摘要行。
在 3.6 版更改: 重復幀的長序列現(xiàn)在將被縮減。
-
format_frame_summary(frame_summary)
Returns a string for printing one of the frames involved in the stack. This method is called for each FrameSummary object to be printed by StackSummary.format(). If it returns
None, the frame is omitted from the output.3.11 新版功能.
FrameSummary 對象
3.5 新版功能.
A FrameSummary object represents a single frame in a traceback.
class traceback.FrameSummary(filename, lineno, name, lookup_line=True, locals=None, line=None)
代表回溯或棧中被格式化或打印的一個單獨幀。 它有時可能還帶有包括在其中的幀局部變量的字符串化版本。 如果 lookup_line 為 False,則不會查找源代碼直到 FrameSummary 已經(jīng)訪問了 line 屬性(這還將發(fā)生在將其轉(zhuǎn)換為元組時)。 line 可能會被直接提供,并將完全阻止行查找的發(fā)生。 locals 是一個可選的局部變量字典,如果有提供的話這些變量的表示形式將被存儲在摘要中以便隨后顯示。
回溯示例
這個簡單示例是一個基本的讀取-求值-打印循環(huán),類似于(但實用性小于)標準 Python 交互式解釋器循環(huán)。 對于解釋器循環(huán)的更完整實現(xiàn),請參閱 code 模塊。
import sys, tracebackdef run_user_code(envdir):source = input(">>> ")try:exec(source, envdir)except Exception:print("Exception in user code:")print("-"*60)traceback.print_exc(file=sys.stdout)print("-"*60)envdir = {}while True:run_user_code(envdir)
下面的例子演示了打印和格式化異常與回溯的不同方式:
import sys, tracebackdef lumberjack():bright_side_of_life()def bright_side_of_life():return tuple()[0]try:lumberjack()except IndexError:exc_type, exc_value, exc_traceback = sys.exc_info()print("*** print_tb:")traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)print("*** print_exception:")traceback.print_exception(exc_value, limit=2, file=sys.stdout)print("*** print_exc:")traceback.print_exc(limit=2, file=sys.stdout)print("*** format_exc, first and last line:")formatted_lines = traceback.format_exc().splitlines()print(formatted_lines[0])print(formatted_lines[-1])print("*** format_exception:")print(repr(traceback.format_exception(exc_value)))print("*** extract_tb:")print(repr(traceback.extract_tb(exc_traceback)))print("*** format_tb:")print(repr(traceback.format_tb(exc_traceback)))print("*** tb_lineno:", exc_traceback.tb_lineno)
該示例的輸出看起來像是這樣的:
*** print_tb:File "", line 10, in lumberjack()*** print_exception:Traceback (most recent call last):File "", line 10, in lumberjack()File "", line 4, in lumberjack bright_side_of_life()IndexError: tuple index out of range*** print_exc:Traceback (most recent call last):File "", line 10, in lumberjack()File "", line 4, in lumberjack bright_side_of_life()IndexError: tuple index out of range*** format_exc, first and last line:Traceback (most recent call last):IndexError: tuple index out of range*** format_exception:['Traceback (most recent call last):\n',' File "", line 10, in \n lumberjack()\n', ' File "", line 4, in lumberjack\n bright_side_of_life()\n', ' File "", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n', 'IndexError: tuple index out of range\n']*** extract_tb:[, line 10 in >, , line 4 in lumberjack>, , line 7 in bright_side_of_life>] *** format_tb:[' File "", line 10, in \n lumberjack()\n', ' File "", line 4, in lumberjack\n bright_side_of_life()\n', ' File "", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n'] *** tb_lineno: 10
下面的例子演示了打印和格式化棧的不同方式:
>>> import traceback>>> def another_function():... lumberstack()...>>> def lumberstack():... traceback.print_stack()... print(repr(traceback.extract_stack()))... print(repr(traceback.format_stack()))...>>> another_function()File "", line 10, in another_function()File "", line 3, in another_function lumberstack()File "", line 6, in lumberstack traceback.print_stack()[('', 10, ' ', 'another_function()'), ('', 3, 'another_function', 'lumberstack()'), ('', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')] [' File "", line 10, in \n another_function()\n', ' File "", line 3, in another_function\n lumberstack()\n', ' File "", line 8, in lumberstack\n print(repr(traceback.format_stack()))\n']
最后這個例子演示了最后幾個格式化函數(shù):
>>> import traceback>>> traceback.format_list([('spam.py', 3, '', 'spam.eggs()'), ... ('eggs.py', 42, 'eggs', 'return "bacon"')])[' File "spam.py", line 3, in\n spam.eggs()\n', ' File "eggs.py", line 42, in eggs\n return "bacon"\n']>>> an_error = IndexError('tuple index out of range')>>> traceback.format_exception_only(type(an_error), an_error)['IndexError: tuple index out of range\n']
文章標題:創(chuàng)新互聯(lián)Python教程:traceback——打印或讀取堆棧的跟蹤信息
URL鏈接:http://www.fisionsoft.com.cn/article/ccidopp.html


咨詢
建站咨詢
