OC

Knowledge OS
主帖 7 条回复

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

sunus 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 条
#1
adad184
2015年05月31日

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

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

#2
sunus
2015年05月31日

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

#3
adad184
2015年05月31日

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

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

#4
sunus
2015年05月31日

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

#5
caipanjin
2015年06月01日

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

#7
liming
2015年10月12日

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

基本差不多了吧!

登录 或者 注册