自定义异常处理
继承你要自定义异常的类,例如我要对RuntimeException
自定义异常
简单代码模板:
public class MyException extends RuntimeException {
private int status; //状态码
public MyException( int status,String message) {
super(message);
this.status = status;
}
}
支持枚举代码:
代码语言:javascript复制/**
* 自定义异常类
*/
public class LyException extends RuntimeException {
private int status; //状态码
public LyException(String message,int status) {
super(message);
this.status = status;
}
/**
* 支持枚举
* @param ceshisglShog
*/
public LyException(ExceptionEnums ceshisglShog) {
super(ceshisglShog.getMessage());
this.status = ceshisglShog.getStatus();
}
public int getStatus() {
return status;
}
}
捕获异常
写完自定义异常是不生效的,原因就是SpringBoot
不知道,所以要捕获异常
在类上添加 @ControllerAdvice
在方法上添加 @ExceptionHandler(自定义异常类.class)
简单代码模板:
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice // 对controller中的方法做增强,做异常处理的增强
public class ControllerExceptionAdvice {
/*
*这个方法的返回类型,可以是一个结果类
*/
@ExceptionHandler(MyException.class) //写自定义异常类或者你要拦截的异常类,如Exception异常类
public String exceptionHandler(MyException ex){
//异常内容
String message = ex.getMessage();
/*
* 具体内容根据需求来
*/
// 返回异常结果
return message ;
}
}
支持返回的结果集的:
代码语言:javascript复制import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* 捕获自定义异常
*/
@ControllerAdvice
public class BasicExceptionAdvice {
@ExceptionHandler(LyException.class)//拦截的自定义异常类
public ResponseEntity handleException(LyException ex){
return ResponseEntity.status(ex.getStatus()).body(new ExceptionResult(ex));
}
}
自定义异常结果
上面两步骤,根据不是特别好,可以来一个 自定义异常结果类
我这个结果类里用到了日期工具类:JodaTime
版本不用写SpringBoot已经集成了
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
代码语言:javascript复制import lombok.Getter;
import org.joda.time.DateTime;
/**
* 自定义异常结果类
*/
@Getter //记得导入lombok,不用直接就来一个 Get方法
public class ExceptionResult {
private int status;//状态码
private String message; //内容
private String timestamp;//时间
public ExceptionResult(LyException e) {
this.status = e.getStatus();
this.message = e.getMessage();
this.timestamp = DateTime.now().toString("yyyy-MM-dd HH:mm:ss");
}
}
自定义异常枚举
最后可以来一个枚举类,里面放内容和状态码
代码语言:javascript复制@Getter //记得导入lombok,不用直接就来一个 Get方法
public enum ExceptionEnums {
//有多少定义多少
ITEM_PRICE_NOT_NULL(501,"价格不能为空"),
UPLOAD_FILE_ERROR(502,"上传失败,请重试");
private int status;
private String message;//内容
ExceptionEnums(int status, String message) {
this.status = status;
this.message = message;
}
}