异常回溯:缺少上层帧

时间:2014-04-04 13:50:23

标签: python exception tornado

在下面的堆栈跟踪中,我想念上面的帧。

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

stacktrace来自unittest TestCase。所有测试都通过,但此回溯位于日志中且可重现。

我无法看到TestCase的哪个测试引发了异常。

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

我如何使用龙卷风来查看上层堆栈跟踪?

异常本身不是问题。

2 个答案:

答案 0 :(得分:0)

您可以使用IOLoop.handle_callback_exceptionsys.exc_info打印,看看具体是什么。

答案 1 :(得分:0)

回调是由ioloop.py:458调用的,就像它说的那样。没有显示外部堆栈帧,因为异常没有逃脱该帧。令你困惑的是,回调继续重新引发之前捕获的异常。

在Python 2中,保留回溯以便稍后再次提升是混乱的(在Python 3中它变得更好)。龙卷风通常在这里做正确的事情,但是有一些空隙会导致追踪被截断。我在当前版本中意识到的主要问题是AsyncHTTPClient倾向于丢弃回溯(并且修复此问题时存在一些恼人的向后兼容性问题)。

作为调试时的粗略解决方法,您可以在抛出异常之前尝试打印traceback.format_stack(至少在可以修改代码的地方,正如您在此处为websocket.py添加异常所做的那样)。