對於這種請求:如何從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(錯誤 域= NSCocoaErrorDomain代碼= 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 = {NSDebugDescr在字符0 iption =無效值})))
我想要做的就是在底層的錯誤,所以我可以解析domain
,code
和userInfo
性能。
我創建BackendError
枚舉該Alamofire提供作爲一個例子在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。
什麼是你嘗試獲得無效響應 –
我想接收特定錯誤時做一些事情的目的。 – Daniel
這是無效的JSON錯誤,那麼你將如何處理 –