我已经找到了解决办法,但仍然想知道答案。为什么我不能在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