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

1 投票
3 回答
2868 浏览
提问于 2025-04-17 18:08

我正在使用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 ...]

...而不是让整个监听器都出问题。我想这可能是因为它发生在不同的线程上吧?

现在我明白这是回调中的一种运行时错误,至少我知道出错的时候我做错了什么——但是如果它对我每个错误都只抛出这个错误,而不给我一些有用的信息,那就让编程变得有点困难了。

这是什么原因造成的?我该怎么做才能得到正常的、更详细的错误追踪信息呢?

3 个回答

0

最后,我通过名字获取了日志记录器,并为它设置了一个流处理器:

import logging

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

关于如何获取一个日志记录器(也就是提问者直接想要的东西),你可以在这里找到相关说明,不过详细的错误追踪信息被隐藏了。

如果你查看一下调用on_message的代码,你会发现这个代码块是在一个没有excepttry块里。

实际调用这个方法的地方在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)
5

看起来它需要一个来自Python日志模块的日志处理器来捕捉输出。日志的配置方式有很多种。不过对于简单的调试,我会使用类似下面的方式:

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

这样就可以捕捉到所有DEBUG级别及以上的输出了。想了解更多信息,可以看看日志模块的文档哦 :)

撰写回答