1. 程式人生 > 其它 >檔案和資料夾新增右鍵選單-DOS通道

檔案和資料夾新增右鍵選單-DOS通道

1、我們使用正常的輸出語句

得到的是(輸出結果:division by zero)雖然得到了錯誤的日誌輸出,但是不知道為什麼出錯,也不能定位具體出錯位置。

2、現在我們使用 traceback

就可以得到具體的錯誤,以及定位到出錯的位置。這樣就能更方便除錯錯誤。

參考文獻

traceback文件地址:

https://docs.python.org/2/library/traceback.html

以下為google翻譯(僅供參考,):

該模組提供了一個標準介面,用於提取,格式化和列印Python程式的堆疊跟蹤。它在列印堆疊跟蹤時完全模仿了Python直譯器的行為。當您想要在程式控制下列印堆疊跟蹤時,這非常有用,例如在直譯器周圍的“包裝器”中。

該模組使用回溯物件 - 這是儲存在變數中的物件型別sys.exc_traceback(不建議使用), sys.last_traceback並作為第三項返回 sys.exc_info()。

該模組定義了以下功能:

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

列印以限制回溯物件tb中的堆疊跟蹤條目。如果 省略limit或者None列印所有條目。如果省略檔案或None輸出轉到sys.stderr; 否則它應該是一個開啟的檔案或類似檔案的物件來接收輸出。

traceback.print_exception(etype,value,tb [,limit [,file ] ] )

列印異常資訊,最多限制堆疊跟蹤條目從traceback tb到檔案。這與print_tb()以下方式不同:(1)如果tb不是None,則列印標題; (2)在堆疊跟蹤後列印異常etype和值 ; (3)如果etype是且值具有適當的格式,則打印出發生語法錯誤的行,其中插入符號表示錯誤的大致位置。Traceback (most recent call last):SyntaxError

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

這是一個簡寫。(實際上,它用於以執行緒安全的方式檢索相同的資訊,而不是使用已棄用的變數。)print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback, limit, file)sys.exc_info()

traceback.format_exc([ 限制] )

這就像print_exc(limit)但返回一個字串而不是列印到檔案。

版本2.4中的新功能。

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

這是一個簡寫。通常,只有在異常達到互動式提示後才會起作用(請參閱參考資料)。print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file)sys.last_type

traceback.print_stack([ f [,limit [,file ] ] ] )

此函式從其呼叫點列印堆疊跟蹤。可選的 f引數可用於指定要啟動的備用堆疊幀。可選的limit和file引數具有相同的含義 print_exception()。

traceback.extract_tb(tb [,限制] )

返回從追溯物件tb中提取的最多限制 “預處理”堆疊跟蹤條目的列表。它對堆疊跟蹤的替代格式化很有用。如果省略limit,則提取所有條目。“預處理”堆疊跟蹤條目是4元組(檔名,行號,函式名*,文字),表示通常為堆疊跟蹤列印的資訊。該文字是開頭和結尾的空白剝離的字串; 如果源不可用則是。NoneNone

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

從當前堆疊幀中提取原始回溯。返回值的格式與extract_tb()。可選的f和limit 引數具有與之相同的含義print_stack()。

traceback.format_list(extracted_list )

給定由extract_tb()or extract_stack()返回的元組列表,返回準備列印的字串列表。結果列表中的每個字串對應於引數列表中具有相同索引的項。每個字串以換行符結尾; 對於那些源文字行不是的專案,字串也可以包含內部換行符 None。

traceback.format_exception_only(etype,value )

格式化回溯的異常部分。引數是異常型別,etype和值,例如由sys.last_type和 給出的sys.last_value。返回值是一個字串列表,每個字串以換行符結尾。通常,列表包含單個字串; 但是,對於 SyntaxError異常,它包含多行(列印時)顯示有關語法錯誤發生位置的詳細資訊。指示發生了哪個異常的訊息是列表中的始終最後一個字串。

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

格式化堆疊跟蹤和異常資訊。引數與相應的引數具有相同的含義print_exception()。返回值是一個字串列表,每個字串以換行符結尾,一些包含內部換行符。連線和列印這些行時,將列印完全相同的文字print_exception()。

traceback.format_tb(tb [,限制] )

簡寫。format_list(extract_tb(tb, limit))

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

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

traceback.tb_lineno(tb )

此函式返回traceback物件中設定的當前行號。這個函式是必要的,因為在2.3之前的Python版本中,當-O標誌傳遞給Python時,tb.tb_lineno沒有正確更新。此功能在2.3版本中沒有用處。

回溯示例

這個簡單的例子實現了一個基本的read-eval- print迴圈,類似於標準Python互動式直譯器迴圈(但不太有用)。有關直譯器迴圈的更完整實現,請參閱該code 模組。


import sys, traceback

def run_user_code(envdir):
source = raw_input(">>> ")
try:
exec source in envdir
except:
print "Exception in user code:"
print '-'*60
traceback.print_exc(file=sys.stdout)
print '-'*60

envdir = {}
while 1:
run_user_code(envdir)

以下示例演示了列印和格式化異常和回溯的不同方法:


import sys, traceback

def lumberjack():
bright_side_of_death()

def bright_side_of_death():
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_type, exc_value, exc_traceback,
limit=2, file=sys.stdout)
print "*** print_exc:"
traceback.print_exc()
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_type, exc_value,
exc_traceback))
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 "<doctest...>", line 10, in <module>
lumberjack()
*** print_exception:
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
File "<doctest...>", line 4, in lumberjack
bright_side_of_death()
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
File "<doctest...>", line 4, in lumberjack
bright_side_of_death()
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 "<doctest...>", line 10, in <module>\n lumberjack()\n',
' File "<doctest...>", line 4, in lumberjack\n bright_side_of_death()\n',
' File "<doctest...>", line 7, in bright_side_of_death\n return tuple()[0]\n',
'IndexError: tuple index out of range\n']
*** extract_tb:
[('<doctest...>', 10, '<module>', 'lumberjack()'),
('<doctest...>', 4, 'lumberjack', 'bright_side_of_death()'),
('<doctest...>', 7, 'bright_side_of_death', 'return tuple()[0]')]
*** format_tb:
[' File "<doctest...>", line 10, in <module>\n lumberjack()\n',
' File "<doctest...>", line 4, in lumberjack\n bright_side_of_death()\n',
' File "<doctest...>", line 7, in bright_side_of_death\n return tuple()[0]\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 "<doctest>", line 10, in <module>
another_function()
File "<doctest>", line 3, in another_function
lumberstack()
File "<doctest>", line 6, in lumberstack
traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
('<doctest>', 3, 'another_function', 'lumberstack()'),
('<doctest>', 7, 'lumberstack', 'print repr(traceback.extract_stack())')]
[' File "<doctest>", line 10, in <module>\n another_function()\n',
' File "<doctest>", line 3, in another_function\n lumberstack()\n',
' File "<doctest>", line 8, in lumberstack\n print repr(traceback.format_stack())\n']

最後一個示例演示了最後幾個格式化函式:


import traceback
traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),
('eggs.py', 42, 'eggs', 'return "bacon"')])
[' File "spam.py", line 3, in <module>\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']