1

我正在使用stomp.py库通过网络获取 JSON 消息。我已经改编了他们在此处给出的简单示例,该示例使用回调来提供消息处理。

但是当我修改那个回调时,我犯了一个简单的错误——例如,我在尝试解析我的 JSON 字符串时调用了 json.load() 而不是 json.loads()。

class MyListener(object):
    def on_message(self, headers, message):
        data = json.load(message)           ## Should be .loads() for a string!

通常这会很好 - 它会出现 AttributeError 并且我会看到回溯。但在这种情况下,Python 会打印:

找不到记录器“stomp.py”的处理程序

...没有追溯,没有崩溃,仅此而已。调试并找出我做错了什么非常令人困惑!我期待至少正常的追溯如下:

Traceback (most recent call last):
  File "./ncl/stomp.py-3.1.3/stompJSONParser.py", line 32, in <module>
    [etc etc ...]

...而不是让整个听众感到厌烦。我想这是因为那发生在不同的线程上?

现在我已经解决了它就像回调中的一种运行时错误,我至少知道当它出错时我做错了什么 - 但如果它只是为我犯的每一个错误喷出那个错误而不是给我某种有用的消息,它使编码有点困难。

这是什么原因造成的?我能做些什么来获得常规的、更详细的回溯

4

3 回答 3

5

看起来它期望设置来自Python 日志记录模块的日志处理程序以捕获输出。有很多可能的日志配置。但是对于简单的调试,我会使用类似的东西

import logging
logging.basicConfig(level=logging.DEBUG)

这应该捕获日志级别 DEBUG 及以上的所有输出。阅读日志文档以获取更多信息:)

于 2013-03-06T14:58:20.273 回答
1

可以在此处找到获取记录器的说明(这是直接要求的),但详细的回溯被抑制。

如果您查看调用 的代码on_message,您会注意到该块位于try没有except.

第 703 行是实际调用该方法的位置:

        notify_func = getattr(listener, 'on_%s' % frame_type)
        notify_func(headers, body)

在方法中__notify(在第 639 行声明):

def __notify(self, frame_type, headers=None, body=None):

这些是它不在 try 块中的时间:

  • 331(connected活动用)
  • 426 参加send活动
  • 743 为disconnected

但是调用的时间message是第 727 行:

# line 719
try:
    # ....
    self.__notify(frame_type, headers, body)
于 2013-03-06T14:58:26.467 回答
0

最后,我按名称抓取了记录器并在其上设置了 StreamHandler:

import logging

log = logging.getLogger('stomp.py')
strh = logging.StreamHandler()
strh.setLevel(logging.ERROR)
log.addHandler(strh);
于 2013-03-06T20:43:46.717 回答