2015-06-09 28 views
2

我有檢查RetrofitError它被傳遞並重新拋出它的自定義異常改造自定義錯誤處理程序+同步和ASYC請求

private static ErrorHandler getErrorHandler() { 
    return new ErrorHandler() { 
     @Override 
     public Throwable handleError(RetrofitError cause) { 
      switch (cause.getKind()) { 
       case NETWORK: return new NetworkException(cause); 
       case HTTP: return new ApiException(cause); 
       default: return cause; 
      } 
     } 
    }; 
} 

自定義錯誤處理程序。如果這是我的終點

@GET(USERS_GET_URL) 
User getUsers() throws NetworkException, ApiException; 

而執行同步請求I try...catch並按需要處理每個自定義異常。當使用

@GET(USERS_GET_URL) 
void getUsers(Callback<User> cb) throws NetworkException, ApiException; 

異步完成處理後的異常被再次拋出爲RetrofitError。下面的代碼片段是從CallbackRunnable類的Retrofit它執行請求

try { 
    final ResponseWrapper wrapper = obtainResponse(); 
    callbackExecutor.execute(new Runnable() { 
    @Override public void run() { 
     callback.success((T) wrapper.responseBody, wrapper.response); 
    } 
    }); 
} catch (RetrofitError e) { 
    Throwable cause = errorHandler.handleError(e); 
    final RetrofitError handled = cause == e ? e : unexpectedError(e.getUrl(), cause); 
    callbackExecutor.execute(new Runnable() { 
    @Override public void run() { 
     callback.failure(handled); 
    } 
    }); 
} 

如可以看出,我的自定義異常越來越被再次拋出爲RetrofitError這讓我鬆有價值的信息。有什麼辦法可以繞過異步請求的自定義錯誤處理嗎?

回答

0

在你ErrorHandler您在Callback#failure(RetrofitError error)尋路原RetrofitError的原因,這樣的結果讓你需要編寫一個代碼實際信息:error.getCause().getCause()。此錯誤將包含服務器使用所有數據發送的響應。

但是,錯誤處理程序是爲同步請求創建的,經過一段時間Square Square決定以這種方式縮小這個差距。欲瞭解更多信息,你可以閱讀:https://gist.github.com/benvium/66bf24e0de80d609dac0

至於我,我不建議使用ErrorHander爲異步方式,因爲我沒有找到什麼好的解決辦法來處理不同類型的錯誤。從最初的RetrofitError獲取數據要容易得多。

相關問題