如何从 Alamofire 错误中获取潜在错误?

Posted

技术标签:

【中文标题】如何从 Alamofire 错误中获取潜在错误?【英文标题】:How do I get at the underlying Error from an Alamofire error? 【发布时间】:2017-03-04 04:04:31 【问题描述】:

对此请求:

Alamofire.request("https://google.com").responseCollection  (response: DataResponse<[User]>) in
  guard response.result.isSuccess else 
    print(response.error)

    return
  

我在控制台中看到了这个:

可选(my_app_name.BackendError.jsonSerialization(Alamofire.AFError.responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(错误 Domain=NSCocoaErrorDomain Code=3840 "字符周围的值无效 0." UserInfo=NSDebugDescription=字符 0.)))))

我的尝试:

Alamofire.request("https://google.com").responseCollection  (response: DataResponse<[User]>) in
  guard response.result.isSuccess else 
    print(response.error)

    if let error1 = response.error as? AFError 
      print(error1)  // Execution DOES NOT reach here.
    

    if let error2 = response.error as? BackendError 
      print(error2) // Execution DOES reach here.
    

    return
  

print(error2) 以上打印:

jsonSerialization(Alamofire.AFError.responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(错误 Domain=NSCocoaErrorDomain Code=3840 "字符周围的值无效 0." UserInfo=NSDebugDescription=字符 0.)))

我要做的是解决底层错误,以便解析domaincodeuserInfo 属性。

我创建了 Alamofire 提供的 BackendError 枚举,作为 https://github.com/Alamofire/Alamofire#handling-errors 的示例:

enum BackendError: Error 
    case network(error: Error) // Capture any underlying Error from the URLSession API
    case dataSerialization(error: Error)
    case jsonSerialization(error: Error)
    case xmlSerialization(error: Error)
    case objectSerialization(reason: String)

我还实现了示例通用响应对象序列化,与https://github.com/Alamofire/Alamofire#generic-response-object-serialization 的示例完全相同:

extension DataRequest 
  @discardableResult
  func responseCollection<T: ResponseCollectionSerializable>(
    queue: DispatchQueue? = nil,
    completionHandler: @escaping (DataResponse<[T]>) -> Void) -> Self 
    let responseSerializer = DataResponseSerializer<[T]>  request, response, data, error in
      guard error == nil else 
        return .failure(BackendError.network(error: error!))
      

      let jsonSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)
      let result = jsonSerializer.serializeResponse(request, response, data, nil)

      guard case let .success(jsonObject) = result else 
        return .failure(BackendError.jsonSerialization(error: result.error!))
      

      guard let response = response else 
        let reason = "Response collection could not be serialized due to nil response."
        return .failure(BackendError.objectSerialization(reason: reason))
      

      return .success(T.collection(from: response, withRepresentation: jsonObject))
    

    return response(responseSerializer: responseSerializer, completionHandler: completionHandler)
  

我认为有 switches、cases 和 BackendErrorAFErrorError 和/或 NSError 之间的转换,但我似乎无法理解.

我怎样才能找到根本错误,以便解析domaincodeuserInfo 属性?

我正在使用 Swift 3 和 Alamofire 4.3.0。

【问题讨论】:

您尝试获取无效响应的目的是什么 收到特定错误时我正在尝试做一些事情。 这也是无效的 JSON 错误,那么你将如何处理 【参考方案1】:

对于 Alamofire 4.3,请查看response.result

if case let .failure(error) = response.result 
    let error = error as NSError
    print("\(error.domain)")
    print("\(error.code)")
    print("\(error.userInfo)")

【讨论】:

这仍然会打印 AF 错误,而不是基础错误。代码为零,userInfo 为空,localizedDescription 是 alamofire 文本,而不是来自底层错误的原始文本。【参考方案2】:

我知道答案有点晚了 ;-)。但是试试这个:

...  catch let error as NSError 
print("UnderlyingError: \(String(describing: error.userInfo[NSUnderlyingErrorKey]))")

【讨论】:

以上是关于如何从 Alamofire 错误中获取潜在错误?的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire+Combine:如何从 AFError 中获取自定义错误类型

如何使用标头从服务器 Alamofire swift 获取数据

Alamofire 和 SwiftyJSon 在请求函数之外获得价值

Alamofire / AlamofireObjectMapper - 如何从 responseObject 打印错误 json?

如何从 API 发送错误

使用 Alamofire 从 API 获取数据时出错