我有一个自定义错误处理程序,用于检查传递的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
,这使我失去了有价值的信息。有没有办法可以绕过异步请求的自定义错误处理?
答案 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
}
获取数据要容易得多。