概述
项目中经常会在方法A中调方法B,如果B出现了异常,A要获取到B的异常,并且在接口中返回,这是一个例子。大概就是需要发送消息到哪里,仅支持邮件、微信,其他的则出错,错误信息用一个列表装着,然后返回。m和n是控制发送时是否出现异常,很简单的,看下代码就懂。
controller
/*** 多层异常处理*/@GetMapping("testLinkedException3")public ResponseResult<List<String>> testLinkedException3(@RequestParam("params") List<String> params,@RequestParam("m") int m,@RequestParam("n") int n){return ResponseResult.success(serviceA.functionA(params, m, n));}
serviceA
public List<String> functionA(List<String> params, int m, int n) {List<String> msg = new ArrayList<>();for (String param : params) {try{if(Objects.equals(param, "邮件")){serviceB.sendEmail(m);}else if(Objects.equals(param, "微信")){serviceB.sendWeChat(n);}else {throw new IllegalArgumentException("异常参数:" + param);}msg.add("成功发送-"+param);}catch (Exception e){msg.add(param + "发送失败,失败原因:" + e.getMessage());}}return msg;}
serviceB
发送邮件
public boolean sendEmail(int n) {try{int res = 10 / n;return res > 0;}catch (Exception e){log.error("邮件发送异常,参数:{}", n, e);throw new MyException("邮件发送失败,参数:"+n);}}
发送微信
public boolean sendWeChat(int n) {try{int res = 10 / n;return res > 0;}catch (Exception e){throw e;}}
接口返回
正常处理的
参数:
params: 邮件,微信
m: 1
n: 1
响应:
{"code": 200,"message": "响应成功","data": ["成功发送-邮件","成功发送-微信"]
}
邮件失败,微信成功
参数:
params: 邮件,微信,QQ
m: 0
n: 1
响应:
{"code": 200,"message": "响应成功","data": ["邮件发送失败,失败原因:邮件发送失败,参数:0","成功发送-微信","QQ发送失败,失败原因:异常参数:QQ"]
}
传多一个qq
参数:
params: 邮件,微信,QQ
m: 1
n: 1
响应:
{"code": 200,"message": "响应成功","data": ["成功发送-邮件","成功发送-微信","QQ发送失败,失败原因:异常参数:QQ"]
}
补充
异常抛出后,如果被上层方法捕获后,控制台是看不到报错信息的。所以需要log打印。