国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

IOS網絡編程之錯誤處理

2019-11-06 10:04:52
字體:
來源:轉載
供稿:網友

網絡編程錯誤

1. 操作系統錯誤

操作系統錯誤是由數據包沒有達到預定目標導致的。數據包可能是建立連接的一部分,也可能位于連接建立的中間階段。

OS錯誤可能由如下原因造成

沒有網絡——可由Reachability框架檢測到無法路由到目標主機——有時可由操作系統迅速檢測到,不過也有可能造成連接超時沒有應用監聽目標端口無法解析目標主機名——由配置錯誤或是嘗試訪問沒有外部名字解析且處于隔離網絡中的主機造成的

NSError

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];

Reachablitity

提供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; }

2. HTTP錯誤

HTTP錯誤是由HTTP請求、HTTP服務器或者應用服務器的問題造成的,其錯誤通過HTTP響應的狀態碼發送給請求客戶端。

100級別:來自于HTTP服務器的信息,表示請求的處理將會繼續,不過帶有警告200級別:服務器成功請求了處理(204表請求成功,不過沒有向客戶端返回負載)300級別:表示客戶端必須執行某個動作才能繼續請求,因為所需資源已移動400級別:客戶端錯誤,發出了服務端無法正確處理的數據。(404表示找不到URL指定的資源)500級別:HTTP服務器與下游服務器之間出現了錯誤。如Web服務器調用了 javaEE應用服務器,Servlet出現了NullPointerException,客戶端則會收到500級別錯誤。

3. 應用錯誤

應用錯誤是由運行在服務層之上的業務邏輯和應用造成的。可能是代碼問題(異常)、語義錯誤(向服務提供了無效賬號)等。對于前者來說,建議生成HTTP500級別錯誤;而后者,應該在應用負載中返回錯誤碼。

錯誤處理的經驗法則

1. 在接口契約中應該指定如何向客戶端發送錯誤信息;

2. 錯誤狀態可能不正確,從移動設備發往服務器的任何網絡請求都有3種可能結果:

設備完全能夠確認操作是成功的設備完全能夠確認操作是失敗的設備模糊的確認操作是失敗的。

如,應用發出在兩個賬戶間轉賬的HTTP請求。請求被銀行系統接收并正確處理;然而,由于網絡失敗應答卻丟失了,NSURLConnect報告超時。超時發生了,但轉賬請求卻成功處理了。如果重試該操作,那就會導致重復轉賬,可能還會造成賬戶透支。 這種場景會導致應用出現意外和檢測不到的錯誤行為。

3. 驗證負載

4. 分離錯誤與正常的業務狀況

5. 總是檢查HTTP狀態

6. 總是檢查NSError的值

7. 使用一致的方法來處理錯誤

8. 總是設置超時時間

IOS中,HTTP請求的默認超時時間間隔是4分鐘,用戶可以自定義超時時間間隔: NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:@"URL" cachePolicy:NSURLCacheStorageAllowed timeoutInterval:20];

優雅地處理網絡錯誤


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 墨脱县| 文山县| 科技| 寻乌县| 临夏市| 两当县| 邵阳县| 苍南县| 九寨沟县| 饶平县| 馆陶县| 天长市| 田阳县| 阳曲县| 东阳市| 靖安县| 南宁市| 邵武市| 宜丰县| 昌平区| 天峻县| 麻栗坡县| 永靖县| 修武县| 梨树县| 玉田县| 米脂县| 康定县| 读书| 团风县| 尉犁县| 湖州市| 萍乡市| 神农架林区| 德庆县| 都江堰市| 封丘县| 宜丰县| 西城区| 察隅县| 五台县|