public class ExceptionUtils {

/*

* 在使用Retrofit+RxJava时,我们访问接口,获取数据的流程一般是这样的:订阅->访问接口->解析数据->展示。

* 如上所说,异常和错误本质是一样的,因此我们要尽量避免在View层对错误进行判断,处理。

*

* 在获取数据的流程中,访问接口和解析数据时都有可能会出错,我们可以通过拦截器在这两层拦截错误。

* 1.在访问接口时,我们不用设置拦截器,因为一旦出现错误,Retrofit会自动抛出异常。

* 2.在解析数据时,我们设置一个拦截器,判断Result里面的code是否为成功,如果不成功,则要根据与服务器约定好的错误码来抛出对应的异常。

* 3.除此以外,为了我们要尽量避免在View层对错误进行判断,处理,我们必须还要设置一个拦截器,拦截onError事件,然后使用ExceptionHandler,让其根据错误类型来分别处理。

*/

/**

* 对应HTTP的状态码

*/

private static final int BAD_REQUEST = 400;

private static final int UNAUTHORIZED = 401;

private static final int FORBIDDEN = 403;

private static final int NOT_FOUND = 404;

private static final int METHOD_NOT_ALLOWED = 405;

private static final int REQUEST_TIMEOUT = 408;

private static final int CONFLICT = 409;

private static final int PRECONDITION_FAILED = 412;

private static final int INTERNAL_SERVER_ERROR = 500;

private static final int BAD_GATEWAY = 502;

private static final int SERVICE_UNAVAILABLE = 503;

private static final int GATEWAY_TIMEOUT = 504;

/**

* 服务器定义的状态吗

* 比如:登录过期,提醒用户重新登录;

* 添加商品,但是服务端发现库存不足,这个时候接口请求成功,服务端定义业务层失败,服务端给出提示语,客户端进行吐司

* 请求接口,参数异常或者类型错误,请求code为200成功状态,不过给出提示,这个时候客户端用log打印服务端给出的提示语,方便快递查找问题

* 其他情况,接口请求成功,但是服务端定义业务层需要吐司服务端返回的对应提示语

*/

/**

* 完全成功

*/

private static final int CODE_SUCCESS = 0;

/**

* Token 失效

*/

public static final int CODE_TOKEN_INVALID = 401;

/**

* 缺少参数

*/

public static final int CODE_NO_MISSING_PARAMETER = 400400;

/**

* 其他情况

*/

public static final int CODE_NO_OTHER = 403;

/**

* 统一提示

*/

public static final int CODE_SHOW_TOAST = 400000;

/**

* 这个可以处理服务器请求成功,但是业务逻辑失败,比如token失效需要重新登陆

* @param code 自定义的code码

*/

public static void serviceException(int code , String content){

if (code != CODE_SUCCESS){

ServerException serverException = new ServerException();

serverException.setCode(code);

serverException.setMessage(content);

handleException(serverException);

}

}

/**

* 这个是处理网络异常,也可以处理业务中的异常

* @param e e异常

*/

public static void handleException(Throwable e){

HttpException ex;

//HTTP错误 网络请求异常 比如常见404 500之类的等

if (e instanceof retrofit2.HttpException){

retrofit2.HttpException httpException = (retrofit2.HttpException) e;

ex = new HttpException(e, ErrorCode.HTTP_ERROR);

switch(httpException.code()){

case BAD_REQUEST:

case UNAUTHORIZED:

case FORBIDDEN:

case NOT_FOUND:

case METHOD_NOT_ALLOWED:

case REQUEST_TIMEOUT:

case CONFLICT:

case PRECONDITION_FAILED:

case GATEWAY_TIMEOUT:

case INTERNAL_SERVER_ERROR:

case BAD_GATEWAY:

case SERVICE_UNAVAILABLE:

//均视为网络错误

default:

ex.setDisplayMessage("网络错误"+httpException.code());

break;

}

} else if (e instanceof ServerException){

//服务器返回的错误

ServerException resultException = (ServerException) e;

int code = resultException.getCode();

String message = resultException.getMessage();

ex = new HttpException(resultException, ErrorCode.SERVER_ERROR);

switch (code){

case CODE_TOKEN_INVALID:

ex.setDisplayMessage("重新登陆");

break;

case CODE_NO_OTHER:

ex.setDisplayMessage("其他情况");

break;

case CODE_SHOW_TOAST:

ex.setDisplayMessage("吐司");

break;

case CODE_NO_MISSING_PARAMETER:

ex.setDisplayMessage("缺少参数");

break;

default:

ex.setDisplayMessage(message);

break;

}

} else if (e instanceof JsonParseException

|| e instanceof JSONException

|| e instanceof ParseException){

ex = new HttpException(e, ErrorCode.PARSE_ERROR);

//均视为解析错误

ex.setDisplayMessage("解析错误");

}else if(e instanceof ConnectException){

ex = new HttpException(e, ErrorCode.NETWORK_ERROR);

//均视为网络错误

ex.setDisplayMessage("连接失败");

} else if(e instanceof java.net.UnknownHostException){

ex = new HttpException(e, ErrorCode.NETWORK_ERROR);

//网络未连接

ex.setDisplayMessage("网络未连接");

} else if (e instanceof SocketTimeoutException) {

ex = new HttpException(e, ErrorCode.NETWORK_ERROR);

//网络未连接

ex.setDisplayMessage("服务器响应超时");

} else {

ex = new HttpException(e, ErrorCode.UNKNOWN);

//未知错误

ex.setDisplayMessage("未知错误");

}

String displayMessage = ex.getDisplayMessage();

//这里直接吐司日志异常内容,注意正式项目中一定要注意吐司合适的内容

ToastUtils.showRoundRectToast(displayMessage);

}

}

python 大量网络请求失败_网络请求异常拦截优化相关推荐

  1. axios请求失败,重试请求

    因项目原因,需要在请求失败时重新请求数据,确保必须拿到数据 基于Vue2+,axios 先封装axios请求,必须设置请求超时如下: 封装重试请求函数: // 重新请求 function tautol ...

  2. 711 发送请求失败_会不会存在不失败的代理IP?

    会不会存在不失败的代理IP?这个问题应该也是很多代理IP使用者心里的疑问,不存在失败的代理IP,也就是100%的成功率.之前也有很多用户问过神龙代理客服,有没有100%的成功率的代理IP,我们的答案是 ...

  3. corspost请求失败_记一次 CORS 跨域请求出现 OPTIONS 请求的问题及解决方法

    今天前后端在联调接口的时候,发生了跨域请求资源获取不到的问题. 首先说明下跨域问题的由来.引自HTTP 访问控制 的一段话: 当 Web 资源请求由其它域名或端口提供的资源时,会发起跨域 HTTP 请 ...

  4. ios 请求失败封装_vue_axios请求封装、异常拦截统一处理

    1.前端网络请求封装.异常统一处理 vue中采用axios处理网络请求,避免请求接口重复代码,以及各种网络情况造成的异常情况的判断,采用axios请求封装和异常拦截操作: axios 请求封装 // ...

  5. linux检查网络是否通畅_网络基础Ping命令详解(使用Ping这命令来测试网络连通)...

    相关知识点 BIOS 在计算机领域,BIOS是 "Basic Input Output System"的缩略语,译为"基本输入输出系统", 与前者读法相同.计算 ...

  6. 思科网络基础课件_网络自动化认证,你选对了吗?

    网络越来越依赖于软件,以及依靠工具来自动执行过往需要手动处理的功能.面对这种转型,网络工程师和管理人员应考虑获得自动化技能,而获取网络自动化认证可能是学习和发展这些技能的最佳方法. 现在网络自动化市场 ...

  7. python 拷贝文件创建目录失败_解决python os.mkdir创建目录失败的问题

    起因 今天使用 python os.mkdir创建目录时遇到的一个小问题: feature_dir = os.path.join(os.getcwd(), 'system', 'feature') i ...

  8. Python:assert断言失败了,但是异常没有捕获,结果也显示通过

    问题描述: assert断言失败了,但是异常没有捕获,结果也显示通过 问题截图: 问题原因: 断言失败了不会自动关闭浏览器,不会抛出异常. 解决方案: 再次抛出异常 raise AssertionEr ...

  9. linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...

    1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...

最新文章

  1. 挖一挖不常用到而又很实用的重载-Trim
  2. Fibonacii数列,兔子问题
  3. PHPstudy新版小P面板进行设置版本
  4. google python的风格规范
  5. php删除尾部字符,php如何删除字符串末尾字符
  6. 微信小程序云数据库带换行的文本保存和获取
  7. 表单单选多选项清除默认样式小技巧
  8. 小白用python处理excel文件-python高手之路python处理excel文件(方法汇总)
  9. 读写Word的组件DocX介绍与入门
  10. red5 + java+flex free download_Flex 4 +Red5 流媒体使用研究2——Flex4的VideoPlayer控件应用...
  11. mysql 查询最早 表_MySQL-如何查询表中最早时间和最晚时间
  12. 在屏幕上绘制圆形函数
  13. python去掉字符串中的特殊字符和数字
  14. 武学大陆-为啥要学IT绝世武功
  15. 【实战教程】使用知晓云完成微信卡券消息的处理
  16. Python 绘画excel分组柱状图(懒人学习)
  17. FireFox必备插件(七)
  18. ubuntu20.04卸载virtualbox失败,“if your system is using efi secure boot you may need to sign the kernel “
  19. 计算机丢失wlanapi all,如何解决wlanapi.dll丢失的问题
  20. C/C++中的void 和 void *

热门文章

  1. 拔剑四顾心茫然,谁来为工业互联网保驾护航?
  2. 构建磷脂双份子层(二)
  3. 【哈工大2022计算机系统大作业“程序人生”】
  4. arcsde for oracle 11gecp,ArcSDE9.3 for AIX 安装
  5. 用Qt设计一款单词本软件,采用SQLite数据库
  6. 激光光路中镜片阈值计算
  7. NSArray去重过滤
  8. openstack实现私有云的搭建
  9. 华为OD机试(JAVA)真题 -- 翻转英文
  10. 解决Adobe Dreamweaver 2020在编程敲代码时又卡又慢延迟的问题(复制黏贴打字都卡)