这篇文章我们介绍下再Springboot中,定义全局异常的返回的工具类信息。这里主要是涉及到3个类,下面分别介绍下:
一、定义一个ErrorCode的枚举类
所有的异常都需要进行统一定义管理,一般我们使用枚举类,所以这里我们定义ErroCode的枚举类案例如下:
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 错误编码
*
*/
@Getter
@AllArgsConstructor
public enum ErrorCode {
UNAUTHORIZED(401, "还未授权,不能访问"),
FORBIDDEN(403, "没有权限,禁止访问"),
INTERNAL_SERVER_ERROR(500, "服务器异常,请稍后再试"),
ACCOUNT_PASSWORD_ERROR(1001, "账号或密码错误");
private final int code;
private final String msg;
}二、定义一个自定义异常
自定义一个异常,在业务模块里面,适当的时机抛出适当的异常。
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 自定义异常
*
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ServerException extends RuntimeException {
private static final long serialVersionUID = 1L;
private int code;
private String msg;
public ServerException(String msg) {
super(msg);
this.code = ErrorCode.INTERNAL_SERVER_ERROR.getCode();
this.msg = msg;
}
public ServerException(ErrorCode errorCode) {
super(errorCode.getMsg());
this.code = errorCode.getCode();
this.msg = errorCode.getMsg();
}
public ServerException(String msg, Throwable e) {
super(msg, e);
this.code = ErrorCode.INTERNAL_SERVER_ERROR.getCode();
this.msg = msg;
}
}三、编写全局异常处理
前面的工作都做完了,这里的话就直接做全局异常的处理,代码如下:
import lombok.extern.slf4j.Slf4j;
import net.srt.framework.common.utils.Result;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 异常处理器
*/
@Slf4j
@RestControllerAdvice
public class ServerExceptionHandler {
/**
* 处理自定义异常
*/
@ExceptionHandler(ServerException.class)
public Result<String> handleException(ServerException ex) {
return Result.error(ex.getCode(), ex.getMsg());
}
/**
* SpringMVC参数绑定,Validator校验不正确
*/
@ExceptionHandler(BindException.class)
public Result<String> bindException(BindException ex) {
FieldError fieldError = ex.getFieldError();
assert fieldError != null;
return Result.error(fieldError.getDefaultMessage());
}
@ExceptionHandler(AccessDeniedException.class)
public Result<String> handleAccessDeniedException(Exception ex) {
return Result.error(ErrorCode.FORBIDDEN);
}
@ExceptionHandler(Exception.class)
public Result<String> handleException(Exception ex) {
log.error(ex.getMessage(), ex);
return Result.error("出错了!异常信息:" + ex.getMessage());
}
}按照这个流程及模板,我们就可以自己做全局异常了。









还没有评论,来说两句吧...