改造自定义错误处理程序+ sync& asyc请求

时间:2015-06-09 22:30:58

标签: android retrofit

我有一个自定义错误处理程序,用于检查传递的RetrofitError并将其重新抛出为自定义异常

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,这使我失去了有价值的信息。有没有办法可以绕过异步请求的自定义错误处理?

1 个答案:

答案 0 :(得分:0)

在您ErrorHandler原因RetrofitError原因中Callback#failure(RetrofitError error),导致您的error.getCause().getCause()获取实际信息,您需要编写下一个代码:ErrorHander。此错误将包含服务器使用所有数据发送的响应。

但错误处理程序是为同步请求创建的,经过一段时间后,团队决定以这种方式缩小这个差距。有关详细信息,请参阅:https://gist.github.com/benvium/66bf24e0de80d609dac0

至于我,我不建议使用RetrofitError进行异步方式,因为我找不到任何好的解决方案来处理不同类型的错误。从最初的// taglib def parentTag = { attrs, body -> out << "<div class='parent'></div>" } def childTag1 = { attrs, body -> // code } def childTag2 = { attrs, body -> // code } 获取数据要容易得多。