系统接口502异常_Java异常处理的正确姿势是什么?你知道吗?

系统异常设计的出发点

  1. 良好的信息展示,开发运维人员能快速定位问题
  2. 响应外部调用异常时,应能明确指明是内部异常还是调用条件不满足导致
  3. 响应用户操作异常时,能友好的提示用户
11de3552b33e3aed39fe9cd986d440d0.png

如何做到上述三点

  1. 对异常进行分类
    1. 内部异常
      1. 资源环境导致
      2. 第三方服务错误响应
      3. 第三方响应结果错误
      4. 外部传入参数非法
      5. 错误的编码逻辑
      6. 错误的配置
      7. 异常的业务数据(业务数据缺失导致)
    2. 业务异常
      1. 用户操作错误
      2. 业务条件不满足

2.在系统中正确的捕获这类 异常,并抛出

    1. 方法入参进行合法性验证
      1. 对系统外部提供的接口,是必须进行参数验证的(必须)
      2. 系统内部对外外层提供的接口,进行验证
      3. public方法 进行参数验证
      4. private方法没必须进行参数验证
    2. 第三方响应结果合法性验证
      1. 获取第三方结果后,根据你们的约定进行验证
    3. 业务处理前,对业务业务前置条件进行验证
      1. 业务处理前,验证业务条件(验证余额,验证这个账户有没有被公安锁定)
      2. 要考虑性能成本(验证身份证号码是不是存在)
    4. 业务处理 后,对处理结果进行验证
      1. 验证对方账户是不是到账了,转出账户是不是成功扣款
      2. 对于可能出现异常 的代码进行try catch捕获4
        1. 尝试恢复处理
        2. 直接抛出
        3. 转换后抛出

3.最后在系统出口统一拦截处理

    1. WEB Response
      1. 内部异常
        1. 引导至异常提示页
      2. 业务异常
        1. 返回对应提示消息至前端
      3. 未知异常
        1. 尝试进行识别,转换成编码异常
    2. HTTP API接口响应
      1. 内部异常:返回接口不可用
      2. 参数错误:基于API文档中的异常列表进行响应返回。表名参数非法,需要调用方加强参数合法性验证
      3. 业务错误:基于接口约定返回对应code与消息
    3. RPC Service响应
      1. 内部异常:返回服务不可用消息
      2. 参数错误:基于接口文档进行响应,直接返回异常堆栈
      3. 业务错误 : 直接返回异常堆栈
    4. checkedException

异常定义技巧

基于分包表示异常的分类,不建议使用继承

创建异常类 定义业务异常,不建议使用Code来定义

使用枚举来表示业务异常的几种结果,不建议使用code

例如:TradeContext

public class TradeContext{ //参数验证断言  //异常转换  //异常信息加工:如国际化public static void assertIsNotNull(Object  param,String message){   if(param==null){     throw new ParamException(message);}}public static void transformExcption(Exception exception){}}public UserInfo getUser(Integer id){  TradeContext.assertIsNotNull(id,"id不能为空");   return mapper.selectBYPrimaryId(id);}

常见的错误异常处理

1、直接忽略

try { new String(source.getBytes("UTF-8"), "GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } 正确的处理方式try { new String(source.getBytes("UTF-8"), "GBK"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("环境不支持UTF-8",e) } 

2、用一个统一异常替代所有业务异常

public class ServiceException extends RuntimeException { public ServiceException(Exception e) { super(e); } public ServiceException(String message) { super(message); } 

`错误:`

- 必须明确定义业务异常

- 尽可能申明为checkedException

- 要带上具体业务数据

`正确方式`: 定义明确的业务异

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值