0

0

0

修罗

站点介绍

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

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

修罗 2023-01-27 771 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)


最新评论

  • https://www.studyglobus.com/author/carroll34a5552/

    Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.

  • Richardgrold

    1xbet onlayn kazino platforması ilə vaxtınızı daha səmərəli və maraqlı keçirin. Saytın canlı kazino bölməsi istifadəçilərə fərqli bir dünya təklif edir. Burada canlı dilerli kazino oyunlarının hər bir növünü sınaqdan keçirə bilərsiniz. Krupyelərin peşəkarlığı oyunun dinamikasını və marağını artırır. Müntəzəm olaraq yenilənən oyun siyahısı cansıxıcılığa yol vermir. Hesabınızı artırmaq üçün onlarla fərqli və etibarlı üsul mövcuddur. Qazanılan pullar cəmi bir neçə dəqiqə ərzində şəxsi hesabınıza köçürülür. Aktiv fəaliyyətinizə görə fərdi bonuslar və hədiyyələr qazana bilərsiniz. Dəstək xidməti həm çat, həm də e-poçt vasitəsilə kömək göstərir. 1xbet ailəsinə qoşulun və böyük uduşlar üçün ilk addımı atın. onlayn kazino

  • 砂岩白丘

    我一直梦想, 看到你们相册那样的地方。真棒。

  • 城市地標

    我喜欢, 这里分享真实经验。你的项目 就是 属于这里的。请继续。

  • 宗教地標

    我热爱这样的想法, 去那么多国家。真的很鼓舞。

  • 觀景高地

    能感受到热爱。继续保持 感受。

  • 最佳季節

    我关注这样的资源, 写得很实在。你的网站 就是 属于这里的。加油。

  • 1

    1

  • 1

    1

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

    1

日历

2026年07月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

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