在下面的堆栈跟踪中,我想念上面的帧。
谁在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
我如何使用龙卷风来查看上层堆栈跟踪?
异常本身不是问题。
答案 0 :(得分:0)
您可以使用IOLoop.handle_callback_exception
从sys.exc_info
打印,看看具体是什么。
答案 1 :(得分:0)
回调是由ioloop.py:458调用的,就像它说的那样。没有显示外部堆栈帧,因为异常没有逃脱该帧。令你困惑的是,回调继续重新引发之前捕获的异常。
在Python 2中,保留回溯以便稍后再次提升是混乱的(在Python 3中它变得更好)。龙卷风通常在这里做正确的事情,但是有一些空隙会导致追踪被截断。我在当前版本中意识到的主要问题是AsyncHTTPClient倾向于丢弃回溯(并且修复此问题时存在一些恼人的向后兼容性问题)。
作为调试时的粗略解决方法,您可以在抛出异常之前尝试打印traceback.format_stack(至少在可以修改代码的地方,正如您在此处为websocket.py添加异常所做的那样)。