【发布时间】:2016-06-14 07:05:28
【问题描述】:
在使用 json.loads 时,我似乎无法捕捉到异常,即使我特别指出了它。当我试图通过大量客户端连接非常快速地发送数据来给我的服务器施加压力时,我在很大程度上看到了这一点。请参阅下面的错误:
(我在错误代码中用 X 替换了我的 IP 地址)
EX:未终止的字符串开始于:第 1 行第 49 列(字符 48)数据: '{"ap-hdop":0.55,"rtcmin":"38","ap-latdec":3.134,"a' 错误:未捕获 python异常,关闭通道 (:未终止的字符串 开始于:第 1 行第 49 列(字符 48) [//faraday_server_handler.py|collect_incoming_data|34] [/usr/lib/python2.7/json/init.py|loads|338] [/usr/lib/python2.7/json/decoder.py|decode|366] [/usr/lib/python2.7/json/decoder.py|raw_decode|382])
我知道代码失败是因为我只是错过了一行上的双引号:
'{"ap-hdop":0.55,"rtcmin":"38","ap-latdec":3.134,"a'
这一行通常要长很多,因此“a....”应该继续并完成它的引号。
这是我的相关代码:
def collect_incoming_data(self, data):
"""Read an incoming message from the client, place JSON message data into buffer"""
#self.logger.debug('collect_fing_data() -> (%d bytes)\n"""%s"""', len(data), data)
try:
loaded_data = json.loads(data)
except ValueError, ex:
self.handle_error()
type,value,traceback = sys.exc_info()
print type
#print "Collect Incoming Data: " . time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime())
print "EX: ", ex
print "Data: ",repr(data)
有什么想法吗?我搜索了互联网以查看是否可以找到此问题,但我似乎正在设置捕获异常,其他所有遇到此负载问题的人似乎都建议这样做。
编辑 2016 年 3 月 1 日 - 晚上
注释掉我的异常 handle_error() 让我看到更多错误:
except ValueError, ex:
self.handle_error()
type,value,traceback = sys.exc_info()
print type
#print "Collect Incoming Data: " . time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime())
print "EX: ", ex
print "Data: ",repr(data)
以下是我的新错误,我已将个人数据注释掉。很明显,我现在真正遇到的问题实际上是未终止的字符串
EX:未终止的字符串,开始于: 第 1 行第 49 列(字符 48)数据: '{"ap-hdop":0.55,"rtcmin":"31","ap-latdec":XX.XXX,"a' EX:无法解码 JSON 对象数据: 'p-latdeg":34,"adc6":2006,"adc7":2007,"adc4":2004,"adc5":2005,"adc2":2002,"adc3":2003,"adc0":2000, "adc1":2001,"gpio-0":30,"gpio-1":50,"gpio-2":70,"speed":5.0,"adc8":2008,"rtcday":"01", "longdeg":118,"longdec":XX.XXX,"altitude":31.0,"ap-speed":0.0,"ap-pdop":0.77,"lat-dir":"N","long-dir ":"W","hdop":0.01,"ap-rf":0,"alt-units":"M","rtcdow":"2","呼号":"XXXXX","ap-呼号":"XXXXX","id":1,"ap-id":1,"rtcyear":"2016","rtcmon":"03","ap-vdop":0.66,"ap-lat-dir ":"N","vdop":0.02,"rtchour":"22","latdec":XX.XXX,"latdeg":34,"ap-longdeg":118,"ap-longdec":XX. XXX,"rtcsec":"15","ap-altitude":86.0,"ap-long-dir":"W","pdop":0.01,"ap-alt-units":"M","法拉第-port":0}'
【问题讨论】:
-
如果您注释掉
self.handle_error(),它会按预期工作吗? except 块中的打印语句肯定是通过查看输出执行的,但我认为handle_error旨在处理未处理的错误。 -
哦,有趣的@TadhgMcDonald-Jensen 实际上确实让我看到了更多问题,我已经通过更新编辑了原始问题!我还没有完全测试它以查看原始错误是否完全消失,但我认为这是解决原始问题的一大步。第二个问题是为什么即使使用终止符“\r\n”,我的数据也会像那样分裂......
-
等一下....您会多次收到
EX:消息!您正在以块的形式接收 json 数据,并且每个部分本身都是无效的!
标签: json python-2.7 sockets server asyncore