我已經找到了解決辦法,但仍然想知道答案。爲什麼我不能在Python中醃一個錯誤的追蹤?
回答
追溯保存對當前線程上調用的每個函數/方法的堆棧幀的引用,從最上面的幀到下一個引發錯誤的點。每個堆棧框架還保存對在調用堆棧中的每個函數時有效的局部和全局變量的引用。因爲沒有辦法讓pickle知道要序列化什麼和忽略什麼,如果你能夠醃一個回溯,你最終會酸洗整個應用程序狀態的移動快照:當pickle運行時,其他線程可能會修改共享變量的值。
一個解決方案是創建一個可選擇的對象來走回溯,只提取您需要保存的信息。
感謝超級明確的答案..使總體感覺。我透過網絡透明地傳送LogRecord的夢想破滅了,但現在我明白了爲什麼它不能完成...... – 2016-06-22 21:07:27
我猜你有興趣保存完整的呼叫上下文(回溯 + 全局 + 當地人每一幀的)。
這對於確定兩個不同調用上下文中相同函數的行爲差異或構建自己的高級工具來處理,顯示或比較這些回溯將非常有用。
的問題是,pickl不知道如何序列化所有類型的對象,可能是在當地人或全局的。
我想你可以建立自己的對象並保存它,過濾出所有那些不是picklabe的對象。這個代碼可以作爲基礎:
import sys, traceback
def print_exc_plus():
"""
Print the usual traceback information, followed by a listing of all the
local variables in each frame.
"""
tb = sys.exc_info()[2]
while 1:
if not tb.tb_next:
break
tb = tb.tb_next
stack = []
f = tb.tb_frame
while f:
stack.append(f)
f = f.f_back
stack.reverse()
traceback.print_exc()
print "Locals by frame, innermost last"
for frame in stack:
print
print "Frame %s in %s at line %s" % (frame.f_code.co_name,
frame.f_code.co_filename,
frame.f_lineno)
for key, value in frame.f_locals.items():
print "\t%20s = " % key,
#We have to be careful not to cause a new error in our error
#printer! Calling str() on an unknown object could cause an
#error we don't want.
try:
print value
except:
print "<ERROR WHILE PRINTING VALUE>"
但不是打印的對象,你可以將它們與自己揀選表示(JSON或陽明格式可能會更好)添加到列表中。
也許你想加載所有的調用上下文,以便爲你的函數重現相同的情況,而無需運行生成它的複雜工作流。我不知道這是否可以完成(因爲內存引用),但在這種情況下,您需要將其從您的格式中反序列化。
更多信息:http://code.activestate.com/recipes/52215-get-more-information-從-回溯/ – yucer 2017-12-14 12:49:01
- 1. 我能做些什麼來追蹤這個錯誤?
- 2. 爲什麼shell返回Python錯誤追蹤當我cd到python骨架目錄
- 3. 爲什麼我不能在Python的空列表中追加一個字符?
- 4. 醃製Python錯誤
- 5. 爲什麼追加到列表會在Python中引發一個NoneType錯誤?
- 6. 爲什麼我得到一個錯誤,說:失蹤;陳述前?
- 7. 爲什麼我不能追加數組?
- 8. 追蹤爲什麼window.open不起作用
- 9. 爲什麼我的Python語句給我一個錯誤?
- 10. 爲什麼我不能記錄錯誤?
- 11. 爲什麼我不能跟蹤我的WCF服務端的錯誤?
- 12. 在Python中的語法錯誤...我不明白爲什麼
- 13. 我怎麼能擺脫掉這個錯誤,爲什麼我不能在頁面
- 14. 爲什麼使用try/except遞歸(?)函數追蹤錯誤?
- 15. 跟蹤追蹤錯誤
- 16. 爲什麼我在Sharepoint中獲取Value不能爲null錯誤?
- 17. 爲什麼追蹤代碼時我所採用的路線錯誤?
- 18. 爲什麼我不能從字典中追加這個值?
- 19. 爲什麼我收到錯誤不能按類型「浮動」 PYTHON
- 20. 爲什麼這個python WMI調用給我一個錯誤?
- 21. 追蹤javascript錯誤
- 22. 爲什麼python的urllib2.urlopen會給我一個403錯誤?
- 23. 爲什麼我的Python代碼返回一個NZEC錯誤
- 24. 爲什麼我的程序錯誤(python)?
- 25. 爲什麼mysql給我一個錯誤?
- 26. 爲什麼這給我一個錯誤?
- 27. 爲什麼current_user給我一個錯誤?
- 28. 爲什麼我有一個錯誤?
- 29. 我怎麼能告訴jenkins我希望從一個maven工作中得到完整的錯誤追蹤?
- 30. 在Django中,爲什麼這個錯誤說我的列不能爲空?
然後,你應該解釋你到底想要做什麼。您可以使用traceback.format_exec()將追蹤轉換爲字符串。字符串顯然是可以醃製的。 – dusktreader 2011-05-26 00:41:04
我不一定抱怨,但我對這爲什麼被低估的感覺很感興趣。 1)缺乏研究,2)不清楚,或3)沒有用處,我猜我選擇了(1)如果必須的話,但這是否意味着我應該列出所有Google結果和書籍*沒有*包含我之後的答案? – Trindaz 2011-05-27 05:51:39
@Trindaz我沒有下降,但如果我不得不猜測三個-1的出處,我想說這是由於你的問題缺乏細節。你爲什麼要嘗試追溯回溯?你發現什麼是解決方法? – 2013-10-08 18:53:40