前言
在日常项目开发中,异常是常见的,但是如何更高效的处理好异常信息,让我们能快速定位到BUG,是很重要的,不仅能够提高我们的开发效率,还能让你代码看上去更舒服,SpringBoot的项目已经对有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理。
自定义RestController异常处理类
package com.gcl.config;
import cn.dev33.satoken.exception.NotLoginException;
import com.gcl.api.ApiResult;
import com.gcl.api.ErrorCode;
import com.gcl.exception.BaseNotifyException;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 全局异常处理,返回统一格式的异常信息
*/
@RestControllerAdvice
@Slf4j
public class ExceptionConfiguration {
/**
* 处理所有没有经过处理的异常
*
* @param exception 异常信息
* @return ApiResult<String>
*/
@ExceptionHandler(Exception.class)
public ApiResult<String> handleUnHandledException(Exception exception) {
exception.printStackTrace();
log.error("未经处理的异常 错误消息:[{}] 异常类:[{}] 异常定位:[{}]", exception.getMessage(), exception.getClass(), exception.getStackTrace()[0]);
return ApiResult.error(ErrorCode.SERVER_EXCEPTION.code, ErrorCode.SERVER_EXCEPTION.message);
}
@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ApiResult<String> handleHttpMessageNotReadableException(HttpMessageNotReadableException exception, @Autowired HttpServletRequest request) {
log.error("错误的请求 请求路径:[{}] 错误消息:[{}]", request.getPathInfo() == null ? request.getServletPath() : request.getPathInfo(), exception.getMessage());
return ApiResult.error(ErrorCode.PARAMS_ERROR.code, ErrorCode.PARAMS_ERROR.message);
}
/**
* 处理参数校验失败异常
*
* @param exception 参数校验失败异常
* @return ApiResult<String>
*/
@ExceptionHandler(BindException.class)
public ApiResult<String> handleBindException(BindException exception) {
return ApiResult.error(ErrorCode.PARAMS_ERROR.code, exception.getBindingResult().getAllErrors().stream()
.map(ObjectError::getDefaultMessage)
.collect(Collectors.joining("; ")));
}
}
评论区