Python回调处理程序 - 更好的错误消息?

时间:2013-03-06 14:51:13

标签: python json error-handling stomp traceback

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

但是当我修改回调时我犯了一个简单的错误 - 例如,在尝试解析我的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 ...]

......而不是整个听众。我猜是因为这发生在另一个线程上?

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

是什么原因引起的?我能做些什么来获得常规,更详细的追溯

3 个答案:

答案 0 :(得分:4)

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

的内容
import logging
logging.basicConfig(level=logging.DEBUG)

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

答案 1 :(得分:1)

可以找到获取记录器(直接询问的内容)的说明here,但是详细的回溯被禁止。

如果您查看code which is calling on_message,您会发现该块位于没有try的{​​{1}}块中。

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

except

在方法 notify_func = getattr(listener, 'on_%s' % frame_type) notify_func(headers, body) 中(在第639行声明):

__notify

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

  • 331(def __notify(self, frame_type, headers=None, body=None): 事件)
  • 426代表connected活动
  • 743 for send

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

message

答案 2 :(得分:0)

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

import logging

log = logging.getLogger('stomp.py')
strh = logging.StreamHandler()
strh.setLevel(logging.ERROR)
log.addHandler(strh);