使用Asynchat进行Python JSON解码无法捕获ValueError异常

时间:2016-03-01 18:02:52

标签: json python-2.7 sockets server asyncore

使用json.loads时,我似乎无法捕获异常,即使我特意将其调出。当我试图用很多客户端连接快速地发送数据来强调我的服务器时,我基本上看到了这一点。请参阅下面的错误:

(我已在错误代码中用X替换了我的IP地址)

  

EX:从第1行第49列开始的未终止字符串(字符48)数据:   '{“ap-hdop”:0.55,“rtcmin”:“38”,“ap-latdec”:3.134,“a”错误:未捕获   python异常,关闭通道    (:未终止的字符串   从第1行第49列开始(char 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 ....应该继续前进并完成它的引用。

这是我的相关代码:

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, “速度”:5.0 “ADC8”:2008, “rtcday”: “01”, “longdeg”:118, “longdec”:XX.XXX, “高度”:31.0, “AP-速度”:0.0, “AP-PDOP”:0.77, “LAT-DIR”: “N”,“长-DIR “:” W “ ”HDOP“:0.01, ”AP-RF“:0, ”ALT-单位“: ”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-高度”:86.0, “AP-长-DIR”: “W”, “PDOP”:0.01, “AP-ALT-单位”: “M”,“法拉第-port“:0}”

1 个答案:

答案 0 :(得分:0)

好的,我的原始问题得到了解答,“为什么我没有捕获ValueError异常,即使我提供代码来执行此操作?”

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

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