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

in cn •  6 years ago 

我做了个查询自己文章的程序,可以通过标题或者文章关键字查找对应的文章,并通过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!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

节点之间数据还会不一致?!

事实是这样的
有可能是不同版本,或者什么其它原因,懒得深究了

Thank you so much for participating in the Partiko Delegation Plan Round 1! We really appreciate your support! As part of the delegation benefits, we just gave you a 3.00% upvote! Together, let’s change the world!

好奇,每个节点的数据不是应该一样的吗???

奇怪

来自于WhereIn Android