概述
项目中经常会在方法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打印。