Python 回调处理程序 - 更好的错误信息?
我正在使用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 个回答
最后,我通过名字获取了日志记录器,并为它设置了一个流处理器:
import logging
log = logging.getLogger('stomp.py')
strh = logging.StreamHandler()
strh.setLevel(logging.ERROR)
log.addHandler(strh);
关于如何获取一个日志记录器(也就是提问者直接想要的东西),你可以在这里找到相关说明,不过详细的错误追踪信息被隐藏了。
如果你查看一下调用on_message
的代码,你会发现这个代码块是在一个没有except
的try
块里。
实际调用这个方法的地方在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)
看起来它需要一个来自Python日志模块的日志处理器来捕捉输出。日志的配置方式有很多种。不过对于简单的调试,我会使用类似下面的方式:
import logging
logging.basicConfig(level=logging.DEBUG)
这样就可以捕捉到所有DEBUG级别及以上的输出了。想了解更多信息,可以看看日志模块的文档哦 :)