自定义异常处理和统一异常处理
一、什么是统一异常处理
1、制造异常
int a = 10/0;
2、什么是统一异常处理
我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理
二、统一异常处理
1、创建统一异常处理器
创建统一异常处理类GlobalExceptionHandler.java:
/**
* 统一异常处理类
*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public R error(Exception e){
e.printStackTrace();
return R.error();
}
}
2、测试
返回统一错误结果
三、处理特定异常
1、添加异常处理方法
GlobalExceptionHandler.java中添加
@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public R error(ArithmeticException e){
e.printStackTrace();
return R.error().message("执行了自定义异常");
}
2、测试
三、自定义异常处理
1、创建自定义异常类
创建MyException.java通用异常类 继承 RuntimeException,RuntimeException 对代码没有侵入性
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyException extends RuntimeException {
@ApiModelProperty(value = "状态码")
private Integer code;
}
2、业务中需要的位置抛出MyException
try {
int a = 10/0;
}catch(Exception e) {
throw new MyException("出现自定义异常", 20001);
// throw new MyException(ResultCodeEnum.UNKNOWN_REASON);//使用ResultCodeEnum枚举中的属性
}
3、添加异常处理方法
GlobalExceptionHandler.java中添加
@ExceptionHandler(MyException.class)
@ResponseBody
public R error(MyException e){
e.printStackTrace();
return R.error().message(e.getMsg()).code(e.getCode());
}
4、测试
四、需要自定义的类
1、定义统一返回结果R.java(创建结果类)
@Data
@ApiModel(value = "全局统一返回结果")
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<String, Object>();
public R() {
}
public static R ok() {
R r = new R();
r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());
r.setCode(ResultCodeEnum.SUCCESS.getCode());
r.setMessage(ResultCodeEnum.SUCCESS.getMessage());
return r;
}
public static R error() {
R r = new R();
r.setSuccess(ResultCodeEnum.UNKNOWN_REASON.getSuccess());
r.setCode(ResultCodeEnum.UNKNOWN_REASON.getCode());
r.setMessage(ResultCodeEnum.UNKNOWN_REASON.getMessage());
return r;
}
public static R setResult(ResultCodeEnum resultCodeEnum) {
R r = new R();
r.setSuccess(resultCodeEnum.getSuccess());
r.setCode(resultCodeEnum.getCode());
r.setMessage(resultCodeEnum.getMessage());
return r;
}
public R success(Boolean success) {
this.setSuccess(success);
return this;
}
public R message(String message) {
this.setMessage(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;
}
}
2、ResultCodeEnum.java(创建返回码定义枚举类)
import lombok.Getter;
import lombok.ToString;
@Getter
@ToString
public enum ResultCodeEnum {
SUCCESS(true, 20000, "成功"),
UNKNOWN_REASON(false, 20001, "未知错误"),
BAD_SQL_GRAMMAR(false, 21001, "sql语法错误"),
JSON_PARSE_ERROR(false, 21002, "json解析异常"),
PARAM_ERROR(false, 21003, "参数不正确");
private Boolean success;
private Integer code;
private String message;
private ResultCodeEnum(Boolean success, Integer code, String message) {
this.success = success;
this.code = code;
this.message = message;
}
}
3、GlobalExceptionHandler.java(创建统一异常处理器)
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler{
@ExceptionHandler(Exception.class)
@ResponseBody
public R error(Exception e){
e.printStackTrace();
return R.error();
}
@ExceptionHandler(BadSqlGrammarException.class)
@ResponseBody
public R error(BadSqlGrammarException e){
e.printStackTrace();
//log.error(ExceptionUtils.getMessage(e));
return R.setResult(ResultCodeEnum.BAD_SQL_GRAMMAR);
}
@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseBody
public R error(HttpMessageNotReadableException e){
e.printStackTrace();
//log.error(ExceptionUtils.getMessage(e));
return R.setResult(ResultCodeEnum.JSON_PARSE_ERROR);
}
@ExceptionHandler(MyException.class)
@ResponseBody
public R error(MyExceptione){
e.printStackTrace();
//log.error(ExceptionUtils.getMessage(e));
return R.error().message(e.getMessage()).code(e.getCode());
}
}
4、MyException.java(创建自定义异常类)
创建MyException.java通用异常类 继承 RuntimeException,RuntimeException 对代码没有侵入性
import lombok.Data;
@Data
public class MyException extends RuntimeException {
private Integer code;
public MyException(String message, Integer code) {
super(message);
this.code = code;
}
public MyException(ResultCodeEnum resultCodeEnum) {
super(resultCodeEnum.getMessage());
this.code = resultCodeEnum.getCode();
}
@Override
public String toString() {
return "MyException{" +
"code=" + code +
", message=" + this.getMessage() +
'}';
}
}