Swift 3中Alamofire上传对象的错误捕获及无网异常排查
Alamofire无网络上传时无法捕获失败状态的问题解决
嘿,这个问题我之前在做Swift项目用Alamofire上传的时候也踩过坑!先给你拆解下问题出在哪,再给你具体的解决办法:
核心原因
你遇到的NSURLErrorDomain Code=-1009是底层网络错误,不是服务器返回的HTTP状态码。这种情况下,请求根本没发送到服务器,自然不会有HTTP响应,所以response.response?.statusCode会返回nil——你之前只判断状态码的话,就会走到默认值分支,完全忽略了真正的错误信息。
简单说:你把「HTTP状态码错误」和「网络层错误」混在一起处理了,前者是服务器给的反馈,后者是请求连服务器都没摸到就失败了。
正确的错误处理逻辑
你需要调整代码,优先处理response.error,再处理状态码,同时区分不同类型的错误场景:
1. 完善上传请求的错误处理
Alamofire.upload(multipartFormData: { multipartFormData in // 这里添加你的表单数据,比如文件、参数 multipartFormData.append("test_param".data(using: .utf8)!, withName: "param_key") }, to: "你的上传接口URL") { result in switch result { case .success(let upload, _, _): upload.responseJSON { response in // 第一步:先检查是否有网络层错误 if let error = response.error { // 把错误转成URLError,判断具体类型 if let urlError = error as? URLError { switch urlError.code { case .notConnectedToInternet: print("提示用户:当前无网络,请检查网络连接") // 这里替换成你的错误提示逻辑,不要用默认值 case .cannotFindHost: print("提示用户:无法连接到服务器,请稍后再试") case .timedOut: print("提示用户:请求超时,请稍后再试") // 其他网络错误类型可以按需添加 default: print("网络错误:\(urlError.localizedDescription)") } } else { print("其他上传错误:\(error.localizedDescription)") } return // 错误处理完直接返回,不用再看状态码 } // 第二步:没有错误时,再处理HTTP状态码 if let statusCode = response.response?.statusCode { switch statusCode { case 200...299: print("上传成功,处理返回数据") case 400...499: print("客户端错误,比如参数不对:\(statusCode)") case 500...599: print("服务器错误:\(statusCode)") default: print("未知状态码:\(statusCode)") } } } case .failure(let error): // 这个分支是上传任务初始化失败的情况,比如URL无效、参数格式错 print("上传任务创建失败:\(error.localizedDescription)") } }
2. 可选:提前检查网络状态(双保险)
你可以用Alamofire自带的网络检测工具,在上传前就判断网络状态,避免用户白操作:
// 初始化网络检测管理器 let reachabilityManager = NetworkReachabilityManager(host: "你的服务器域名") reachabilityManager?.startListening { status in switch status { case .notReachable: print("当前无网络") case .reachable(.ethernetOrWiFi), .reachable(.wwan): print("网络可用") case .unknown: print("网络状态未知") } } // 上传前先检查 if let isReachable = reachabilityManager?.isReachable, isReachable { // 执行上传逻辑 } else { print("请先连接网络再上传") }
注意:网络检测只能做预判,不能完全替代上传后的错误处理(比如检测后突然断网的情况),所以两种方式结合更稳妥。
总结你的问题点
- 错误处理逻辑顺序错了:你先判断了状态码,但无网络时根本没有状态码,导致错误被忽略;
- 未识别URLError类型:
-1009是系统定义的无网络错误码,需要从response.error里提取判断; - 混淆了两种错误场景:上传任务初始化失败(
.failure分支)和请求发送失败(upload.response里的error)是不同的,需要分别处理。
内容的提问来源于stack exchange,提问作者tolerate_Me_Thx
相关产品推荐
相关产品推荐

