You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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("请先连接网络再上传")
}

注意:网络检测只能做预判,不能完全替代上传后的错误处理(比如检测后突然断网的情况),所以两种方式结合更稳妥。

总结你的问题点

  1. 错误处理逻辑顺序错了:你先判断了状态码,但无网络时根本没有状态码,导致错误被忽略;
  2. 未识别URLError类型:-1009是系统定义的无网络错误码,需要从response.error里提取判断;
  3. 混淆了两种错误场景:上传任务初始化失败(.failure分支)和请求发送失败(upload.response里的error)是不同的,需要分别处理。

内容的提问来源于stack exchange,提问作者tolerate_Me_Thx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:11:00