如何从Alamofire错误得到底层错误?
对于这个请求:
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(Error Domain = NSCocoaErrorDomain Code = 3840“Invalid value around the character 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(Error Domain = NSCocoaErrorDomain Code = 3840“Invalid value around the character 0”)UserInfo = {NSDebugDescription =字符0周围的值无效})))
我想要做的是得到底层的错误,所以我可以parsingdomain
, code
和userInfo
属性。
我创build了BackendError
在https://github.com/Alamofire/Alamofire#handling-errors中提供的BackendError
枚举:
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
,但我似乎无法得到它。
我如何得到底层的错误,所以我可以parsingdomain
, code
和userInfo
属性?
我正在使用Swift 3和Alamofire 4.3.0。
看看response.result
:
if case let .failure(error) = response.result { let error = error as NSError print("\(error.domain)") print("\(error.code)") print("\(error.userInfo)") }