-
使用@ControllerAdvice和@ExceptionHandler注解
/** * @author 旺旺米雪饼 */ @RestControllerAdvice @Slf4j public class GlobalException { @ExceptionHandler(value = BJFUException.class) public Result<String> exception(BJFUException e) { log.error("全局异常处理器捕获到自定义异常!{},message:{},stack:{}", e, e.getMessage(), e.toString()); return new Result<>(ResultEnum.SYSTEM_ERROR, e.getMessage()); } }
@ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法专门处理该类异常,比如上面的BJFUException.class是一个自定义的异常类。
/**
* @author 旺旺米雪饼
*/
public class BJFUException extends Exception {
/**
* 无参构造函数
*/
public BJFUException() {
super();
}
/**
* 用详细信息指定一个异常
*
* @param message
*/
public BJFUException(String message) {
super(message);
}
/**
* 用指定的详细信息和原因构造一个新的异常
*
* @param message
* @param cause
*/
public BJFUException(String message, Throwable cause) {
super(message, cause);
}
/**
* 用指定原因构造一个新的异常
*
* @param cause
*/
public BJFUException(Throwable cause) {
super(cause);
}
}
此时注解的参数是BJFUException.class,表示只有方法抛出BJFUException.class类里定义的异常时,才会调用该方法。
我们可以在controller层来抛出BJFUException
if (userId < 0) {
throw new BJFUException("参数id不合法");
}
2.自定义异常
自定义异常通常和全局异常一起使用,自定义异常可以继承自RuntimeException、BaseException等基本异常类。
例如:
/**
* 用户信息异常类
*/
public class UserException extends BaseException {
private static final long serialVersionUID = 1L;
public UserException(String code, Object[] args)
{
super("user", code, args, null);
}
}