异常回溯:缺少上部帧



在下面的堆栈跟踪中,我错过了上部帧。

谁在第 458 行 ioloop.py 调用了 callback()?

堆栈跟踪来自单元测试用例。所有测试都通过,但此回溯在日志中且可重现。

我看不出在测试用例的哪个测试中提出了异常。

ERROR    [25950] Exception in callback <functools.partial object at 0x5358368>
Traceback (most recent call last):
  File "/home/modwork_foo_dtg/lib/python2.7/site-packages/tornado/ioloop.py", line 458, in _run_callback
    callback()
  File "/home/modwork_foo_dtg/lib/python2.7/site-packages/tornado/stack_context.py", line 331, in wrapped
    raise_exc_info(exc)
  File "/home/modwork_foo_dtg/lib/python2.7/site-packages/tornado/stack_context.py", line 302, in wrapped
    ret = fn(*args, **kwargs)
  File "/home/modwork_foo_dtg/src/websocketrpc/websocketrpc/client.py", line 71, in connect
    self.ws = websocket_connect(self.args.url)
  File "/home/modwork_foo_dtg/src/websocketrpc/websocketrpc/client.py", line 179, in websocket_connect
    conn = websocket.WebSocketClientConnection(io_loop, request)
  File "/home/modwork_foo_dtg/lib/python2.7/site-packages/tornado/websocket.py", line 777, in __init__
    raise Exception('%s %s' % (request, request.url))
Exception: <tornado.httpclient._RequestProxy object at 0x535cb10> None

如何使用龙卷风查看上部堆栈跟踪帧?

例外本身不是问题。

您可以使用

IOLoop.handle_callback_exceptionsys.exc_info打印,以查看具体中断的内容。

回调是由 ioloop.py:458 调用的,就像它所说的那样。 不显示外部堆栈帧,因为异常未转义该帧。 让您感到困惑的是,回调继续重新引发之前捕获的异常。

在 Python 2 中,保留回溯以便稍后重新引发是很混乱的(在 Python 3 中会变得更好)。 龙卷风通常在这里做正确的事情,但有一些间隙,回溯会被截断。 我知道当前版本中的主要问题是AsyncHTTPClient倾向于丢弃回溯(并且解决此问题存在一些烦人的向后兼容性问题)。

作为调试时的粗略解决方法,您可以在引发异常之前尝试打印traceback.format_stack(至少在修改代码可行的情况下,就像您在此处向 websocket.py 添加异常所做的那样)。

最新更新