如何避免 App 应为收到网络 API 数据返回异常而导致的解析 Crash.

sunus 发布于 2015年05月30日
无人欣赏。

如何避免 App 应为收到网络 API 数据返回异常而导致的解析 Crash.

hi, 我目前遇到一个比较头疼的问题, 就是有时候在调用网络的 API 的时候. 往往会因为返回的数据格式异常, 内容异常, 返回 API 的约定而造成解析之后的 Crash, 请问下大家是如何处理这种问题的?

比如, 我有一个 API 是这样的 http://xxx.com/getToken.json 返回的数据一般是这样的

{
    success: 1/0
    content: {
        token: tokenString, // "asdasdsad"
        code:  404, // an integer
        someData: xxx
    }
}

这个 API 约定 如果 success 为 1, 那么 content 里的 token, code, someData 都是应该存在, 且合法的. 但是如果是因为服务端的 BUG 或者异常, 这个接口返回这样. success 为 1, 但是 token 没有, 那么我在取 token 值的时候

token = [response valueForKeyPath:@"content.token"];

则会取到 nil 值, 那么我在之后使用 这个 nil 值的时候很可能会导致 crash, 比如把这个值放到一个Dictionary里.

又或者, 这个 API 约定 code 一定为一个 整数. 那么我在取这个值的时候, 是这样

code = [[response valueForKeyPath:@"content.code"] integerValue]

但是, 这个时候万一这个 code 是一个 NSArray.. 那么.. 我又 crash 了..

所以, 我想请教下大家有什么经验来处理这种异常返回结果导致 App Crash 的问题? 谢谢

共7条回复
adad184 回复于 2015年05月31日

你都知道token异常时是nil 还这个问题还是问题么?

异常问题异常处理 使用前先判断一下token是非是nil不久行了

sunus 回复于 2015年05月31日

1楼 @adad184 我的意思是,如果这样 岂不是每个用到的值都需要判断? 这样好难受...

adad184 回复于 2015年05月31日

2楼 @sunus 这是服务端的问题 应该找服务端来解决 而不是替他们擦屁股...

另一种办法就是 把所有返回值都定位string 然后自己写一个valueForKeyPathNotNil的方法

sunus 回复于 2015年05月31日

3楼 @adad184 但是对于 App 在线上跑来说.. 服务端有时候搞这种 我真的不能 crash ╮(╯▽╰)╭

caipanjin 回复于 2015年06月01日

本来这个服务端是要保证格式正确的,不过有时候确实难以完全做到,比如服务器挂了,服务器的nginx可能直接就返回一个500的错误页面。理论上,这个应该跟服务器端约定好:如果http status code 为200,应该要做到格式与约定的一致,否则算服务器端bug。一般做法是,客户端收到服务器返回,先判断一下http status code,如果200的情况格式不对,找服务端修正不过;非200的话,客户端做异常处理。

iRobbin 回复于 2015年06月02日

试试Mantle

liming 回复于 2015年10月12日

这个问题需要有很多处理方式: 1.验证返回是否为空 2.验证返回是否合法 3.验证解析是否正确 4.遇到数组,字典等字段 先判断是否为[xxx class], 5.数据,字典 每个元素,key 都需要空判断

基本差不多了吧!

登录 或者 注册