如何从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周围的值无效})))

我想要做的是得到底层的错误,所以我可以parsingdomaincodeuserInfo属性。

我创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,并从BackendErrorAFErrorError ,和/或NSError ,但我似乎无法得到它。

我如何得到底层的错误,所以我可以parsingdomaincodeuserInfo属性?

我正在使用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)") }