案例一
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 'zhangsan' for key 'employee.idx_username'
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);
}
}
}
案例二
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Result<List<String>> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
LinkedList<String> errors = Lists.newLinkedList();
if (!CollectionUtils.isEmpty(allErrors)) {
allErrors.forEach(objectError -> errors.add(objectError.getDefaultMessage()));
}
errorFixedPosition(e);
log.error("_> 错误原因:");
log.error("_> {}", e.getMessage());
log.error("=============================错误打印完毕=============================");
return Result.error("");
}
/**
* 处理空指针的异常
*
* @param e 参数
* @return 返回异常信息
*/
@ExceptionHandler(value = NullPointerException.class)
public Result exceptionHandler(NullPointerException e) {
errorFixedPosition(e);
log.error("_> 错误原因:");
log.error("_> {}", e.getMessage());
log.error("=============================错误打印完毕=============================");
return Result.error("空指针的异常");
}
/**
* 处理其他异常
*
* @param e 参数
* @return 返回异常信息
*/
@ExceptionHandler(value = Exception.class)
public Result exceptionHandler(Exception e) {
errorFixedPosition(e);
log.error("_> 错误原因:");
log.error("_> {}", e.getMessage());
log.error("=============================错误打印完毕=============================");
return Result.error("其他异常");
}
/**
* 定位错误发生的位置
*
* @param e 错误参数
*/
private void errorFixedPosition(Exception e) {
final StackTraceElement stackTrace = e.getStackTrace()[0];
final String className = stackTrace.getClassName();
final int lineNumber = stackTrace.getLineNumber();
final String methodName = stackTrace.getMethodName();
e.printStackTrace();
log.error("=============================错误信息如下=============================");
log.error("_> 异常定位:");
log.error("_> 类[{}] ==> 方法[{}] ==> 所在行[{}]\n", className, methodName, lineNumber);
}
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public Result<String> exceptionHandler(SQLIntegrityConstraintViolationException exception){
log.error(exception.getMessage());
//这里判断出来是添加员工时出现的异常
if (exception.getMessage().contains("Duplicate entry")){
//exception对象分割,同时存储
String []splitErrorMessage=exception.getMessage().split(" ");
/**
* splitErrorMessage数组内存的信息
* Duplicate entry '新增的账号' for key 'idx_username'
* 下标位2是新增账号,下标位5是关联的字段名
*/
String errorMessage = "重复了:" + splitErrorMessage[2];
return Result.error(errorMessage);
}
return Result.error("失败了");
}
@ExceptionHandler(SMTPAddressFailedException.class)
public Result<String> exceptionHandler(SMTPAddressFailedException exception){
log.info("邮件的格式不对:"+exception.getMessage());
return Result.error("邮件的格式不对,请再次输入");
}
@ExceptionHandler(RedisConnectionException.class)
public Result<String> exceptionHandler(RedisConnectionException exception){
log.error("没开redis呢"+exception.getMessage());
return Result.error("没开redis呢");
}
@ExceptionHandler(FileNotFoundException.class)
public Result<String> exceptionHandler(FileNotFoundException exception){
log.error("图片挂了:"+exception.getMessage());
return Result.error("图片挂了");
}
@ExceptionHandler(NotLoginException.class)
public Result<String> exceptionHandler(NotLoginException exception){
log.error("用户没有登录:"+exception.getMessage());
return Result.error("NOTLOGIN");
}
@ExceptionHandler(NotRoleException.class)
public Result<String> exceptionHandler(NotRoleException exception){
log.info("当前账号没有绑定对应角色");
return Result.error("当前账号没有绑定对应角色!");
}
@ExceptionHandler(CustomerException.class)
public Result<String> exceptionHandler(CustomerException exception){
log.info("白切鸡在售,请先停售");
return Result.error("白切鸡在售,请先停售");
}
@ExceptionHandler(NotPermissionException.class)
public Result<String> exceptionHandler(NotPermissionException exception){
log.info("该账号没有对应权限");
return Result.error("该账号没有对应权限!");
}
@ExceptionHandler(AmqpIllegalStateException.class)
public Result<String> exceptionHandler(AmqpIllegalStateException exception){
log.info("消息还没发生,接收者还在等待");
return Result.error("消息还没发生,接收者还在等待!");
}
@ExceptionHandler(IllegalStateException.class)
public Result<String> exceptionHandler(IllegalStateException exception){
log.info("定时任务还没启动,现在关不了");
return Result.error("定时任务还没启动,现在关不了");
}
}