改造处理来自服务器的错误
Retrofit handling errors from server
刚刚绑定 Retrofit,非常棒。不想发明新东西所以有什么方法可以处理 failure()
中所有可能的错误。
或者唯一的方法是检查所有状态,例如显示对话框?
@Override
public void failure(RetrofitError error) {
}
我在网上遇到了一个自定义错误处理程序(要点),它肯定会对您有所帮助。
https://gist.github.com/benvium/66bf24e0de80d609dac0
您可以通过实现 ErrorHandler 接口来创建自定义错误处理程序。然后可以使用其余适配器构建器的 setErrorHandler(您的自定义错误处理程序) 方法在您的其余适配器上设置)。
如果您构建自己的 retrofitadapter,您会看到它可以选择包含自定义错误处理程序。使用方法是.setErrorHandler(errorHandler);
所以您可以做的是创建以下 class 并按照上述方式将其附加到您的改造构建器:
public class ErrorUtil implements ErrorHandler {
public ErrorUtil() {
}
public Throwable handleError(RetrofitError cause) {
String errorDescription = null;
Log.e("NON FATAL ERROR: ", cause.getLocalizedMessage());
if (cause.getKind().equals(RetrofitError.Kind.NETWORK)) {
if (!isNetworkAvailable()) {
errorDescription = ErrorConstants.ERROR_CONNECTION_OFFLINE;
} else if (cause.getMessage().contains("Unable to resolve host") || cause.getMessage().contains("Invalid sequence") || cause.getMessage().contains("Illegal character") || cause.getMessage().contains("was not verified")) {
errorDescription = ErrorConstants.ERROR_UNABLE_TO_RESOLVE_HOST;
} else if (cause.getLocalizedMessage().contains("timeout") || cause.getLocalizedMessage().contains("timed out") || cause.getLocalizedMessage().contains("failed to connect")) {
errorDescription = ErrorConstants.ERROR_CONNECTION_TIMEOUT;
} else if (cause.getLocalizedMessage().equals("Connection closed by peer") || cause.getLocalizedMessage().equals("host == null") || cause.getLocalizedMessage().contains("CertPathValidatorException")) {
errorDescription = ErrorConstants.ERROR_UNABLE_TO_RESOLVE_HOST;
} else {
errorDescription = ErrorConstants.ERROR_NETWORK;
}
} else if (cause.getKind().equals(RetrofitError.Kind.CONVERSION)) {
errorDescription = ErrorConstants.ERROR_JSON_RESPONSE_CONVERSION;
} else if (cause.getResponse() == null) {
errorDescription = ErrorConstants.ERROR_NO_RESPONSE;
} else {
errorDescription = ErrorConstants.ERROR_UNKNOWN;
}
Log.d("ERRORUTILReturn", errorDescription);
return new Exception(errorDescription);
}
很抱歉发布了一大堆代码,但这是我们用来从改造错误处理程序中获取人类可读错误格式的解决方案。您可以对其进行编辑以更好地匹配您的错误集。我们还在错误处理程序 class.
中本地化了错误消息
然后只需使用以下内容就可以向用户显示一个易于阅读的错误格式:
@Override
public void failure(RetrofitError error) {
error.getLocalizedMessage();
}
刚刚绑定 Retrofit,非常棒。不想发明新东西所以有什么方法可以处理 failure()
中所有可能的错误。
或者唯一的方法是检查所有状态,例如显示对话框?
@Override
public void failure(RetrofitError error) {
}
我在网上遇到了一个自定义错误处理程序(要点),它肯定会对您有所帮助。
https://gist.github.com/benvium/66bf24e0de80d609dac0
您可以通过实现 ErrorHandler 接口来创建自定义错误处理程序。然后可以使用其余适配器构建器的 setErrorHandler(您的自定义错误处理程序) 方法在您的其余适配器上设置)。
如果您构建自己的 retrofitadapter,您会看到它可以选择包含自定义错误处理程序。使用方法是.setErrorHandler(errorHandler);
所以您可以做的是创建以下 class 并按照上述方式将其附加到您的改造构建器:
public class ErrorUtil implements ErrorHandler {
public ErrorUtil() {
}
public Throwable handleError(RetrofitError cause) {
String errorDescription = null;
Log.e("NON FATAL ERROR: ", cause.getLocalizedMessage());
if (cause.getKind().equals(RetrofitError.Kind.NETWORK)) {
if (!isNetworkAvailable()) {
errorDescription = ErrorConstants.ERROR_CONNECTION_OFFLINE;
} else if (cause.getMessage().contains("Unable to resolve host") || cause.getMessage().contains("Invalid sequence") || cause.getMessage().contains("Illegal character") || cause.getMessage().contains("was not verified")) {
errorDescription = ErrorConstants.ERROR_UNABLE_TO_RESOLVE_HOST;
} else if (cause.getLocalizedMessage().contains("timeout") || cause.getLocalizedMessage().contains("timed out") || cause.getLocalizedMessage().contains("failed to connect")) {
errorDescription = ErrorConstants.ERROR_CONNECTION_TIMEOUT;
} else if (cause.getLocalizedMessage().equals("Connection closed by peer") || cause.getLocalizedMessage().equals("host == null") || cause.getLocalizedMessage().contains("CertPathValidatorException")) {
errorDescription = ErrorConstants.ERROR_UNABLE_TO_RESOLVE_HOST;
} else {
errorDescription = ErrorConstants.ERROR_NETWORK;
}
} else if (cause.getKind().equals(RetrofitError.Kind.CONVERSION)) {
errorDescription = ErrorConstants.ERROR_JSON_RESPONSE_CONVERSION;
} else if (cause.getResponse() == null) {
errorDescription = ErrorConstants.ERROR_NO_RESPONSE;
} else {
errorDescription = ErrorConstants.ERROR_UNKNOWN;
}
Log.d("ERRORUTILReturn", errorDescription);
return new Exception(errorDescription);
}
很抱歉发布了一大堆代码,但这是我们用来从改造错误处理程序中获取人类可读错误格式的解决方案。您可以对其进行编辑以更好地匹配您的错误集。我们还在错误处理程序 class.
中本地化了错误消息然后只需使用以下内容就可以向用户显示一个易于阅读的错误格式:
@Override
public void failure(RetrofitError error) {
error.getLocalizedMessage();
}