想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理
创建统一异常处理类GlobalExceptionHandler.java:
/**
* 描述:统一异常处理类
*/
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)//指定异常
@ResponseBody
public R error(Exception e){
e.printStackTrace();
return R.error().message("执行了全局异常处理");
}
}
在请求里面制造异常
int a = 10/0;
返回结果
GlobalExceptionHandler.java中添加异常处理方法
//特定异常
@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public R error(ArithmeticException e) {
e.printStackTrace();
return R.error().message("执行了ArithmeticException异常处理..");
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class SelfDefinedException extends RuntimeException{
@ApiModelProperty(value = "状态码")
private Integer code;
private String message;
}
try {
int a = 10/0;
}catch(Exception e) {
throw new SelfDefinedException(20001,"出现自定义异常");
}
GlobalExceptionHandler.java中添加
// 自定义异常
@ExceptionHandler(SelfDefinedException.class)//指定异常
@ResponseBody
public R error(SelfDefinedException e){
log.error(ExceptionUtil.getMessage(e));
e.printStackTrace();
return R.error().message(e.getMessage()).code(e.getCode());
}
异常处理类GlobalExceptionHandler.java完整代码:
/**
* 描述:统一异常处理类
*/
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)//指定异常
@ResponseBody //返回格式
public R error(Exception e){
e.printStackTrace();
return R.error().message("执行了全局异常处理");
}
//特定异常
@ExceptionHandler(ArithmeticException.class)
@ResponseBody //为了返回数据
public R error(ArithmeticException e) {
e.printStackTrace();
return R.error().message("执行了ArithmeticException异常处理..");
}
// 自定义异常
@ExceptionHandler(SelfDefinedException.class)//指定异常
@ResponseBody //返回格式
public R error(SelfDefinedException e){
e.printStackTrace();
return R.error().message(e.getMessage()).code(e.getCode());
}
}
给页面的统一的返回结果对象
@Data
public class R {
@ApiModelProperty(value = "是否成功")
private Boolean success;
@ApiModelProperty(value = "返回码")
private Integer code;
@ApiModelProperty(value = "返回消息")
private String message;
@ApiModelProperty(value = "返回数据")
private Map<String,Object> data = new HashMap<>();
private R(){}
public static R ok(){
R r = new R();
r.setSuccess(true);
r.setCode(ResultCode.SUCCESS);
r.setMessage("成功");
return r;
}
public static R error(){
R r = new R();
r.setSuccess(true);
r.setCode(ResultCode.ERROR);
r.setMessage("失败");
return r;
}
public R success(Boolean success){
this.setSuccess(success);
return this;
}
public R message(String message){
this.message = message;
return this;
}
public R code(Integer code){
this.setCode(code);
return this;
}
public R data(String key,Object value){
this.data.put(key,value);
return this;
}
public R data(Map<String,Object> map){
this.setData(map);
return this;
}
}
总的来说自定义异常分为以下三步:
第一步 创建自定义异常类继承RuntimeException并写异常属性
第二步 在统一异常类添加规则
第三步 执行自定义异常
自定义异常在项目用的比较多,方便更好的和前端交互,从而达到更好的效果,应该在项目中规范起来!