0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

封装网络请求框架(四)封装异常处理

修罗 2023-01-27 548 0条评论 安卓

首页 / 正文

1690056577756.png

请求异常会走到下面逻辑

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自定义提示框

自定义Toast提示

public class TipUtil {
    public static void showError(String toast) {
        SuperToast.error(toast);
    }
    public static void showError(int resourceToast) {
        SuperToast.error(resourceToast);
    }
}

测试访问404地址

1690056771137.png

评论(0)


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis