【问题标题】:Python JSON Decoding With Asynchat Cannot Catch ValueError Exception使用 Asynchat 的 Python JSON 解码无法捕获 ValueError 异常
【发布时间】: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


【解决方案1】:

好的,我最初的问题是“为什么我没有捕捉到 ValueError 异常,即使我提供了代码来做到这一点?”

@tadhg McDonald-jensen 的评论是正确的,他删除了我对 handle_error() 的调用。

我还有一些其他问题,但它们是不同的问题。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2018-04-04
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多