这个主要是从苍穹外卖项目中学到的,是本人对苍穹项目里面的内容做一些笔记,底层的原理还不明白,目前只是做个笔记后面需要使用的时候能够快速的使用,不需要去搜索,后面有机会了会进行补充学习。
但是需要根据项目的业务类型进行使用,有的情况可能是不适用的,比如说是批处理有可能是不适用的。像商城类的项目,外卖类型,用户中心等类型的比较适用。
全局异常处理器,处理项目中抛出的业务异常
主要是用到了两个注解
@RestControllerAdvice:定义在类上面
@ExceptionHandler:定义在方法上,方法的参数就是要全局处理的异常类,自己定义的异常类建议都继承RuntimeException类。
/**
* 业务异常
*/
public class BaseException extends RuntimeException {
public BaseException() {
}
public BaseException(String msg) {
super(msg);
}
}
然后继承业务异常创建一个自己要使用的异常类,后面在抛出业务异常的子类时就会被全局异常捕获然后将异常信息组装成响应信息。
package com.sky.handler;
import com.sky.constant.MessageConstant;
import com.sky.exception.BaseException;
import com.sky.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.sql.SQLIntegrityConstraintViolationException;
/**
* 全局异常处理器,处理项目中抛出的业务异常
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 捕获业务异常
* @param ex
* @return
*/
@ExceptionHandler
public Result exceptionHandler(BaseException ex){
log.error("异常信息:{}", ex.getMessage());
return Result.error(ex.getMessage());
}
/**
* 处理SQL异常
* @param ex
* @return
*/
@ExceptionHandler
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
// Duplicate entry 'lisi' for key 'idx_username'
log.error("异常信息:{}", ex.getMessage());
String message = ex.getMessage();
if (message.contains("Duplicate entry")) {
String[] split = message.split(" ");
String username = split[2];
String msg = username + MessageConstant.ALREADY_EXISTS;
return Result.error(msg);
} else {
return Result.error(MessageConstant.UNKNOWN_ERROR);
}
}
}