错误类型
- 操作系统错误 通常由HTTP服务器引起
- HTTP 错误 通常由HTTP服务器或应用服务器引起
- 应用错误 通常由请求中的数据传输或应用服务器问题引起
NSError
用NSError来表示错误对象,它拥有如下属性:
- code NSInteger对象,标明发生了哪个错误。
- Domain 标明错误是谁产生的。
- User Info NSDictionary对象
OS ERROR
由以下错误引起:
- 没有联网
- 无法连接到指定主机
- 无应用监听指定端口
- 无法解析指定主机名
在每一次call之前,用Reachability检查网络的可到达性,检测1.设备是否有可用的网络连接,2.该网络下指定主机是否可达到,3.判断是哪种网络:Wi-Fi,W WAN 还是都都不是,4.提示网络状态的所有改变。
NetworkStatus reach = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];
1.检查网络连接是否存在:
reach == NotReachable不存在
2.检查指定主机是否可以被访问,如果用于每个请求,会显著增加网络开销和延迟,所以不建议在主线程调用,否则有可能会阻塞主线程。
Reachability *reach = [Reachability reachabilityWithHostName:@"www.captechconsulting.com"];
3.检查网络类型
reach == ReachableViaWWAN // Network Is reachable via WWAN (aka. carrier network)
reach == ReachableViaWiFi // Network is reachable via WiFi
4.提示网络状态改变
Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier]; // kReachabilityChangedNotification
HTTP Error
由以下问题引起:
HTTP请求, HTTP服务器或应用程序服务器造成。
HTTP错误通过HTTP响应中的状态码传送给发出请求的客户端。404状态是一个常见的例子,表明在URL中指定的资源找不到。
有五类HTTP错误:
Informational 100-level - 表示该请求的处理将继续,但有一个警告。
Successful 200-level - 每个200-level状态表示请求成功的不同的结果。204表示请求成功,但是没有payload返回到客户端。
Redirection needed 300-level - 指出客户端必须执行一些行动来继续请求,因为所需的资源已经被移动。
Client Errors 400-level - 表示客户端发送错误数据,服务器不能正确处理。
Downstream errors 500-level - 表示HTTP服务器和任何下游应用服务器之间发生了错误。
NSHTTPURLResponse *response=nil;
NSError *error=nil;
NSData *myData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
[response statusCode]; //就是状态码
Application Errors
这个是程序自己在逻辑上设定的,比如:在余额为100的支付宝试图转走200块。
如何处理错误
- Interface Contract中包含错误处理
- 特别处理移动网络下的错误状态
- 确认payload是否有效(JSON和XML有确认机制,但是CSV和HTML没有)
- 区分网络错误和正常的业务情况
- 检查HTTP状态(Always)
- 检查NSError(Always)
- 设计一个统一的方式来处理错误
- 设置一个合理的超时值