调了大半宿的程序,惹祸的竟然是......

调了大半宿的程序,惹祸的竟然是......

我做了个查询自己文章的程序,可以通过标题或者文章关键字查找对应的文章,并通过STEEMIT打开,以前用着一直好好的,给我提供了不少便捷。


(图源 :pexels.com)

可是前段时间迁移电脑的时候,发现更新功能不好用了,所谓的更新功能就是把自己(或对应账户)的新文章(相比数据库中已经存在的)抓取到库里。

每次一运行更新功能程序就崩溃退出,好吧,我比较懒,所以对程序的要求是能用就行,所以几乎没做什么输出输出检查。因为新电脑上用了新版本的OFFICE,新版本的VS,所以我一直怀疑是新电脑导致的问题。

因为一直没法更新,所以我程序的文章库还停留在2018年11月以前的内容,每次需要翻最近的文章,我就在STEEMIT上使劲的拉啊拉啊,尤其现在STEEMIT被封,这事就更难操作了。

昨晚下定决心要修复这个更新存在的问题,可是打开VS开始调试程序,我的程序逻辑其实挺简单的,核心代码就是调用get_discussions_by_author_before_dateAPI:

{"jsonrpc": "2.0", "method": "call", "params": ["database_api", "get_discussions_by_author_before_date", ["oflyhigh", "", "2019-0320T00:44:18", 2]], "id": 1}

然后根据返回的内容重组API的JSON参数部分,再继续调用,直到读出所有的新文章。以前这样做一直没问题,可是我跟踪下来之后,发现每次运行到这里时,JSON解析就抛出异常了。

JSON解析我用的是nlohmann/json JSON for Modern C++,以前我在Linux下和Windows都分别做过简单测试,还是很好用的,可是这次为啥崩溃了呢?

看了一下崩溃时报的信息,是遇到了额外的异常数据,也就是说返回的数据不是标准的JSON格式,可是返回的数据太长了,不方便看,咋调?于是我想到执行一个简单的调用,看看是否异常,比如说get_block

{"jsonrpc": "2.0", "method": "call", "params": ["condenser_api", "get_block", [1]], "id": 1}

结果用block 1,解析一切正常,可能是创世块数据太少了?那就换个稍晚点的块,换成2000000块后发现JSON异常了,这两者有什么差异呢?

我在Linux下用简单的命令行调用,再输出返回内容,我发现get_block调用2000000块的时候,返回的后边多了字符的\n

这个图里演示了正常的返回,和异常的返回。

Python3带的JSON解析器可以正常解析,没有任何问题,而nlohmann/json就失败了,当然可能和我没用明白有关。

一般遇到这个问题,有两个思路

  • 更新JSON库或者找个能正确处理末尾\n等无效字符的JSON库。
  • 自己代码中对输入做一些过滤,去掉末尾无效字符。

但是我觉得我程序不健壮是另外一个问题,而主要问题是节点返回的数据不对,我何不试试换个节点呢?

换了个新节点,发现程序一起正常,哎折腾我大半宿的问题原来就这么简单😔。

相关链接


Vote For Me As Witness
https://steemit.com/~witnesses type in oflyhigh and click VOTE

Vote @oflyhigh via Steemconnect
Thank you!

This page is synchronized from the post: 调了大半宿的程序,惹祸的竟然是……

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×