2017-03-04 51 views
0

對於這種請求:如何從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 =無效值})))

我想要做的就是在底層的錯誤,所以我可以解析domaincodeuserInfo性能。

我創建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,AFErrorError,和/或NSError,但我似乎無法得到它。

如何獲取底層錯誤,以便我可以解析domain,codeuserInfo屬性?

我使用的是Swift 3和Alamofire 4.3.0。

+0

什麼是你嘗試獲得無效響應 –

+0

我想接收特定錯誤時做一些事情的目的。 – Daniel

+0

這是無效的JSON錯誤,那麼你將如何處理 –

回答

1

response.result

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