我怎样才能在以下情况下完全追踪,包括呼叫func2
和func
功能?
import traceback
def func():
try:
raise Exception('Dummy')
except:
traceback.print_exc()
def func2():
func()
func2()
当我运行它时,我得到:
Traceback (most recent call last):
File "test.py", line 5, in func
raise Exception('Dummy')
Exception: Dummy
traceback.format_stack()
不是我想要的,因为需要将traceback
对象传递给第三方模块。
我对这种情况特别感兴趣:
import logging
def func():
try:
raise Exception('Dummy')
except:
logging.exception("Something awful happened!")
def func2():
func()
func2()
在这种情况下,我得到:
ERROR:root:Something awful happened!
Traceback (most recent call last):
File "test.py", line 9, in func
raise Exception('Dummy')
Exception: Dummy
正如Mechmind回答的那样,堆栈跟踪仅由引发异常的位置与try
块的位置之间的帧组成。如果您需要完整的堆栈跟踪,显然您不走运。
除了可以将堆栈条目从顶层提取到当前帧之外,其他一切都可以进行traceback.extract_stack
管理。问题在于,通过所获取的信息traceback.extract_stack
来自直接检查堆栈帧而没有在任何时候创建回溯对象的情况,并且logging
API需要一个回溯对象来影响回溯输出。
幸运的是,logging
不需要 实际的 追溯对象,它需要一个可以传递给traceback
模块格式化例程的对象。traceback
也不在乎-
它仅使用回溯的两个属性,即帧和行号。因此,应该有可能创建鸭子类型的人造回溯对象的链接列表,并将其作为回溯传递。
import sys
class FauxTb(object):
def __init__(self, tb_frame, tb_lineno, tb_next):
self.tb_frame = tb_frame
self.tb_lineno = tb_lineno
self.tb_next = tb_next
def current_stack(skip=0):
try: 1/0
except ZeroDivisionError:
f = sys.exc_info()[2].tb_frame
for i in xrange(skip + 2):
f = f.f_back
lst = []
while f is not None:
lst.append((f, f.f_lineno))
f = f.f_back
return lst
def extend_traceback(tb, stack):
"""Extend traceback with stack info."""
head = tb
for tb_frame, tb_lineno in stack:
head = FauxTb(tb_frame, tb_lineno, head)
return head
def full_exc_info():
"""Like sys.exc_info, but includes the full traceback."""
t, v, tb = sys.exc_info()
full_tb = extend_traceback(tb, current_stack(1))
return t, v, full_tb
有了这些功能,您的代码仅需要进行小小的修改:
import logging
def func():
try:
raise Exception('Dummy')
except:
logging.error("Something awful happened!", exc_info=full_exc_info())
def func2():
func()
func2()
…给出预期的输出:
ERROR:root:Something awful happened!
Traceback (most recent call last):
File "a.py", line 52, in <module>
func2()
File "a.py", line 49, in func2
func()
File "a.py", line 43, in func
raise Exception('Dummy')
Exception: Dummy
请注意,faux-traceback对象可用于自省(显示局部变量或作为自变量),pdb.post_mortem()
因为它们包含对实际堆栈框架的引用。
问题内容: 这个问题的答案是 社区的努力。编辑现有答案以改善此职位。它目前不接受新的答案或互动。 我使用以下代码来获取完整的URL: 问题在于,我在自己的中使用了一些掩码,因此我们在URL中看到的并不总是文件的真实路径。 我需要的是获取URL,写在URL中的内容,仅此而已-完整的URL。 我需要了解它在Web浏览器的导航栏中的显示方式,而不是服务器上文件的真实路径。 问题答案: 看一下,即 请注意
我正在刮网页使用JSoup库通过选择类属性,其中包含"nav"字符串。 这是获取网站超文本标记语言的代码: 正如您所看到的,id=“varPreviewMenu”的ul元素包含Jsoup检索到的HTML不包含的li元素。 我怎样才能得到那些元素?
问题内容: 在numpy中,我们可以获取对引发错误的警告的回溯。 是否有跟踪警告的一般方法? 发出警告时,我可以使python进行追溯吗? 问题答案: 通过分配给,您可以获得想要的东西。该警告模块文档本身建议您这样做,所以它不是你被诱惑的 源黑暗的一面 。:) 您可以通过分配给,将其替换为替代功能。 您可以定义一个新函数,该函数可以正常执行操作,并且还可以打印堆栈。然后,将其放置而不是原始放置:
假设我的示例url是 http://example.com/one/two 我说我有以下路线 的值将为。 如何获取Express中的完整url?例如,在上面的情况下,我希望收到。
问题内容: 假设有人输入这样的网址: 我想返回: 不 这是我现在拥有的代码 但这又回来了 问题答案: 检查下面的代码,它应该做的很好。
我在页面中有一个图像滑块,我想通过单篇文章放置图像,wordpress提供get_post_gallery功能通过单篇文章获取图像,这一阶段已经完成,但问题是它显示缩略图图像,我想在滑块上显示完整图像,就像我们在特色图像场景中所做的那样$img=wp\u get\u attachment\u image\u src(get\u post\u缩略图\u id($post- 我想根据我在functio
问题内容: 有没有一种简单的方法可以打印的完整路径? 的 应该打印 问题答案: 使用 readlink :
问题内容: 假设我的示例网址是 http://example.com/one/two 我说我有以下路线 值将是。 如何在Express中获取 完整的URL ?例如,在上述情况下,我想收到。 问题答案: 该协议可从下载。这里的文档 在express 3.0之前,除非您看到已设置并具有value 的协议,否则可以假定为该协议,在这种情况下,您知道这是您的协议 主机来自Gopal指示 希望您的URL中不