如何从 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.)))
我要做的是解决底层错误,以便解析domain
、code
和userInfo
属性。
我创建了 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)
我认为有 switch
es、case
s 和 BackendError
、AFError
、Error
和/或 NSError
之间的转换,但我似乎无法理解.
我怎样才能找到根本错误,以便解析domain
、code
和userInfo
属性?
我正在使用 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?