项目全局异常怎么处理
一、使用指定注解来拦截异常
@ControllerAdvice()
拦截拥有指定注解的类。
/**
* 全局异常处理类
*/
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler{
}
@ControllerAdvice(annotations = {RestController.class, Controller.class})
即拦截被注解@RestController和@Controller标注类中的异常,并交由GlobalExceptionHandler该类来处理。
@ExceptionHandler
拦截到的指定异常处理的方法,括号内添加报错的异常信息的类
/**
* 异常处理方法
* @return
*/
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
log.error(ex.getMessage());
if(ex.getMessage().contains("Duplicate entry")){
String[] split = ex.getMessage().split(" ");
String msg = split[2] + "已存在";
return R.error(msg);
}
return R.error("未知错误");
}
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
当抛出数据库中执行违反完整性约束异常时,Spring MVC框架会自动将该异常转发给当前的@ExceptionHandler方法进行处理,并将返回值作为HTTP响应返回给客户端。
二、自定义本地异常类
/**
* 自定义业务异常类,直接继承运行时异常即可
*/
public class CustomException extends RuntimeException {
public CustomException(String message){
super(message);
}
}
三、将本地自定义异常交由全局异常托管 (完整代码如下)
/**
* 全局异常处理
*/
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {
/**
* 异常处理方法
* @return
*/
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
log.error(ex.getMessage());
if(ex.getMessage().contains("Duplicate entry")){
String[] split = ex.getMessage().split(" ");
String msg = split[2] + "已存在";
return R.error(msg);
}
return R.error("未知错误");
}
/**
* 异常处理方法
* @return
*/
@ExceptionHandler(CustomException.class)
public R<String> exceptionHandler(CustomException ex){
log.error(ex.getMessage());
return R.error(ex.getMessage());
}
}