近段时间,有时候程序会崩溃,郁闷。
这个问题好找,因为总是在进行月历搜索,即搜索哪些天有录像数据哪些天没有的时候崩溃的,当然不是一定崩溃,而是有时候会崩溃。
通过跟踪发现,在崩溃的时候,是月历搜索结果为空,远程返回了错误。
编译器是vs2010 c++,使用的json库如下图所示,头文件列表:
源文件列表:
正常的搜索结果为:
{“HD”:{“MSG”:5,”TASK”:99418},”PM”:{“RES”:20170320,”ERR”:0,”VEH”:1367}}
此时,经过如下的处理后,只获取 PM 的内容用于月历显示:
Json::Value jsonReq;
Json::Reader jsonReader;
if (!jsonReader.parse(pMsgBuf, jsonReq))
{
MyLog("client parse json failed:%s.", pMsgBuf);
return 0;
}
Json::FastWriter fastWriter;
std::string jsonStr = fastWriter.write(jsonReq["PM"]);
// jsonStr就是取得的 "PM" 值
取出的结果为 {“RES”:20170320,”ERR”:0,”VEH”:1367}
而当搜索结果为空时,如下所示:
{“HD”:{“MSG”:5,”TASK”:99418},”PM”:{“RES”:null,”ERR”:4294967295,”VEH”:1367}}
其中的 4294967295 实际为-1的无符号数,原本远程应该传过来-1,但是变成了这个大整数。
在经过以上的代码段取出的“PM”结果jsonStr值就变成了下面的样子:
{“RES”:null,”ERR”:4294967295.0,”VEH”:1367}}
这在后面程序解析这个串后获取“ERR”值时,原本以整数来取的,现在变成了浮点数,从而导致失败,由于没有加try … catch …,所以程序崩溃。
除了这种情况,这个json库对数据的处理太不灵活,数据类型稍有对不上,就throw一个异常出来