iOS网络错误处理
2016-04-28 本文已影响1713人
快乐的小梁同学
导语
在iOS应用中,有不少在网络错误时表现很差劲,有的会疯狂弹出UIAlertViewController以告诉用户出现了"404 Error On Server"等类似信息,有的应用在网络变慢时界面会变得没有响应,还有的会直接崩溃。这些情况的出现都是没有很好的理解网络失败模式以及没有预期到可能的网络降级或是失败,如果想要避免这类错误并能充分地理解网络错误,那么我们首先需要理解它们的起源。
分层网络
设备网络与网络互联的复杂性导致了分层网络的产生。分层网络将这种复杂环镜划分成了更加易于管理的模块。
分层网络从下至上分别是:
- 物理网络 (->网络帧)->硬件接口(->Internet包)
- Internetn层 (->传输流)(网络层)
- 传输层(->应用消息)
- 应用层
分层网络中的每一层都会执行某种错误检测。错误检测出现在栈的每一层,自下而上直到应用层,应用层则会从语法和语义上检测消息。
iOS中出现的错误
在使用iOS中的URL加载系统时,虽然手机与服务器之间的连接可能会出现各种各样的问题,不过可以将这些原因分成3种错误类别。这些错误类别与创建HTTP请求的操作序列相关。
- 操作系统错误 (没有网络,无法路由到目标主机,没有应用监斩目标端口,无法解析目标主机名)
- HTTP错误(由HTTP请求,HTTP服务器,应用服务器。HTTP错误通过HTTP响应的状态码发送给请求客户端)
- 应用错误
常见是400级别--表示客户端发出了服务器无法正确处理的错误数据。比如,未知的URL或是不正确的HTTP头会导致这个范围内的错误。
错误处理的经验法则
- 在接口契约中处理错误:在设计服务接口时,只指定输入,输出与服务操作的做法是不正确的。接口契约还应该指定如何向客户端发送错误信息。服务接口应该使用业界标准方式在可能的情况下传递错误信息(比如,有的后台会重定义新的HTTP状态值)
- 验证负载。客户端与服务器之间传递的负载都有一种验证机制。不过以逗号分隔的值文件与HTML没有这种机制。
- 错误状态可能不正确。设备模糊地确认操作是失败的,比如前几天,我在“啥当网”上购买图书,发出支付请求以在我账户向目标账户转账。请求被银行系统接收并正确处理;然而,由于网络超时或者服务器负载过大,对方认为失败了。但是却是在转账成功之后发生的。我重新支付,导致被扣两次钱(ps:最后我打客服电话,钱退给我了)。
第三种场景是我亲身经历,这种场景会导致应用出现意外和检测不到的错误行为。如果应用开发者不知道它的存在,那么他们可能会错误的假设请求失败。开发者必须考虑导致请求失败的原因,及测试。 - 总是检测NSError值。即使在网络良好的情况下
- 使用一致的方法来处理错误