请求异常会走到下面逻辑
private void handlerRequest(T data, Throwable error) {
...
// 框架处理错误,比如弹出提示等等
HandleExceptionUtil.handlerRequest(data, error);
}
handlerRequest接收两个参数,data是请求成功后的响应对象,error是请求失败的异常响应对象;
public class HandleExceptionUtil {
/**
* 网络请求错误处理
*/
public static <T> void handlerRequest(T data, Throwable error) {
if(error != null){
// 先处理有异常的请求
handleException(error);
}else {
if (data instanceof Response) {
// retrofit里面的对象
// 获取响应对象
Response response = (Response) data;
// 获取响应码
int code = response.code();
// 判断响应码
if (code >= 200 && code <= 299) { // 网络请求正常
} else {
handleHttpError(code);
}
// BaseResponse业务通用网络请求响应模型,根据接口信息创建
} else if (data instanceof BaseResponse) {
// 判断具体的业务请求是否成功
BaseResponse response = (BaseResponse) data;
if (TextUtils.isEmpty(response.getMessage())) {
// 没有错误提示信息
TipUtil.showError(R.string.error_unknown); // 未知错误
} else {
TipUtil.showError(response.getMessage());
}
}
}
}
private static void handleException(Throwable error) {
/* if(error.getCause() != null){
// 如果发生异常有原因,就先判断原因
error = error.getCause();
}*/
// 判断错误类型
if (error instanceof UnknownHostException) {
TipUtil.showError(R.string.error_network_unknown_host); // 找不到服务器
} else if (error instanceof ConnectException) {
TipUtil.showError(R.string.network_error); // 你的网络好像不给力
} else if (error instanceof SocketTimeoutException) {
TipUtil.showError(R.string.error_network_timeout); // 连接服务器超时
} else if (error instanceof HttpException) {
HttpException exception = (HttpException) error;
// 获取响应码
int code = exception.code();
handleHttpError(code);
} else if (error instanceof IllegalArgumentException) {
// 本地参数错误
TipUtil.showError(R.string.error_parameter);
} else {
String message = error.getLocalizedMessage();
// StringUtils.isNotBlank: apache common lang3工具包
// 提供了StringUtils等这样的类
// http://commons.apache.org/proper/commons-lang/
// implementation 'org.apache.commons:commons-lang3:3.8'
if (StringUtils.isNotBlank(message)) {
message = AppContext.getInstance().getString(R.string.error_unknown_format, message); // 未知错误: %1$s
} else {
message = AppContext.getInstance().getString(R.string.error_unknown); // 未知错误
}
TipUtil.showError(message);
}
}
/**
* 处理Http错误
*
* @param code
*/
private static void handleHttpError(int code) {
if (code == 401) {
TipUtil.showError(R.string.error_network_not_auth); // 登录信息过期
// AppContext.getInstance().logout();
} else if (code == 403) {
TipUtil.showError(R.string.error_network_not_permission); // 你没有权限访问
} else if (code == 404) {
TipUtil.showError(R.string.error_network_not_found); // 你访问的内容不存在
} else if (code >= 500) {
TipUtil.showError(R.string.error_network_server); // 服务器错误
} else {
TipUtil.showError(R.string.error_unknown); // 未知错误
}
}
}
TipUtil自定义提示框
public class TipUtil {
public static void showError(String toast) {
SuperToast.error(toast);
}
public static void showError(int resourceToast) {
SuperToast.error(resourceToast);
}
}
1
1
1
1
1
1
1
1
1
1