操作系統錯誤是由數據包沒有達到預定目標導致的。數據包可能是建立連接的一部分,也可能位于連接建立的中間階段。
OS錯誤可能由如下原因造成:
沒有網絡——可由Reachability框架檢測到無法路由到目標主機——有時可由操作系統迅速檢測到,不過也有可能造成連接超時沒有應用監聽目標端口無法解析目標主機名——由配置錯誤或是嘗試訪問沒有外部名字解析且處于隔離網絡中的主機造成的IOS通過NSError在軟件組件中傳遞錯誤信息
NSError的創建:有3個主要屬性:
code——標識錯誤的NSInteger值,對于產生該錯誤的錯誤域來說該值是唯一的;domain——指定錯誤域的NSString指針,如NSPOSIXErrorDomain,NSOSStatusErrorDomain及NSMachErrorDomain;userInfo——NSDictionary指針,包含特定于錯誤的值。NSMutableDictionary *errorDict = [NSMutableDictionary dictionary];[errorDict setValue:@"錯誤信息" forKey:NSLocalizedDescriptionKey];NSError *error = [NSError errorWithDomain:@"myDomain" code:-100 userInfo:errorDict];提供4個主要功能:
標識設備是否具備可用的網絡連接標識當前的網絡連接是否可以到達某個特定的主機標識當前使用的是哪種網絡技術:WIFI、WWAN還是什么技術都沒用在網絡狀態發生變化時發出通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChanged:) name:kReachabilityChangedNotification object:nil]; // 添加對網絡狀態變化的監聽Reachability *reachability = [Reachability reachabilityForInternetConnection];[reachability startNotifier]; // 開始監聽// 獲取當前網絡的狀態- (void)getNetWorkStatus:(Reachability *)reach { NetworkStatus status = [reach currentReachabilityStatus]; switch (status) { case NotReachable: NSLog(@"NotReachable"); break; case ReachableViaWiFi: NSLog(@"wifi"); break; case ReachableViaWWAN: NSLog(@"wwan"); break; default: break; }}之前,要判斷當前網絡是否能訪問某特定主機可以這樣用:
Reachability *reachability = [Reachability reachabilityWithHostName:@"訪問的主機地址"];if (reachability == NotReachable) { // 訪問不了}但經過測試,在IOS10上(只在iOS10上試過),這種方法并不能真正判斷出是否能訪問特定主機,而是通過第三方框架RealReachability能達到這種目的。
#define GLobalRealReachability [RealReachability sharedInstance][GLobalRealReachability reachabilityWithBlock:^(ReachabilityStatus status) { switch (status) { case NotReachable: { // No network break; } case ReachableViaWiFi: { // WiFi break; } case ReachableViaWWAN: { // Wwan break; } default: break; }HTTP錯誤是由HTTP請求、HTTP服務器或者應用服務器的問題造成的,其錯誤通過HTTP響應的狀態碼發送給請求客戶端。
100級別:來自于HTTP服務器的信息,表示請求的處理將會繼續,不過帶有警告200級別:服務器成功請求了處理(204表請求成功,不過沒有向客戶端返回負載)300級別:表示客戶端必須執行某個動作才能繼續請求,因為所需資源已移動400級別:客戶端錯誤,發出了服務端無法正確處理的數據。(404表示找不到URL指定的資源)500級別:HTTP服務器與下游服務器之間出現了錯誤。如Web服務器調用了 javaEE應用服務器,Servlet出現了NullPointerException,客戶端則會收到500級別錯誤。應用錯誤是由運行在服務層之上的業務邏輯和應用造成的。可能是代碼問題(異常)、語義錯誤(向服務提供了無效賬號)等。對于前者來說,建議生成HTTP500級別錯誤;而后者,應該在應用負載中返回錯誤碼。
如,應用發出在兩個賬戶間轉賬的HTTP請求。請求被銀行系統接收并正確處理;然而,由于網絡失敗應答卻丟失了,NSURLConnect報告超時。超時發生了,但轉賬請求卻成功處理了。如果重試該操作,那就會導致重復轉賬,可能還會造成賬戶透支。 這種場景會導致應用出現意外和檢測不到的錯誤行為。
IOS中,HTTP請求的默認超時時間間隔是4分鐘,用戶可以自定義超時時間間隔:   NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:@"URL" cachePolicy:NSURLCacheStorageAllowed timeoutInterval:20];
新聞熱點
疑難解答