SpringBoot版本:2.5.6
@ControllerAdvice
(类似的还有@RestControllerAdvice
) 注解,可以用于定义@ExceptionHandler
、@InitBinder
、@ModelAttribute
,并应用到所有@RequestMapping
、@PostMapping
, @GetMapping
注解中。
我们可以利用这个注解做SpringBoot项目的全局异常处理。
package com.whut.idea.freefancy.common.exception;
import com.whut.idea.freefancy.common.response.ResponseJson;
import com.whut.idea.freefancy.controller.PublicController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author LiMing
* @date 2021/11/11 16:15
*/
@ControllerAdvice
public class ExceptionControllerAdvice {
private static final Logger LOG = LoggerFactory.getLogger(ExceptionControllerAdvice.class);
@ResponseBody
@ExceptionHandler(value =Exception.class)
public Object exceptionHandler(Exception e){
// 获取异常信息,记录日志
StackTraceElement stackTraceElement = e.getStackTrace()[0];
String className = stackTraceElement.getClassName();
String fileName = stackTraceElement.getFileName();
int lineNumber = stackTraceElement.getLineNumber();
String methodName = stackTraceElement.getMethodName();
LOG.error("类名:{},文件名:{},行数:{},办法名:{}", className, fileName, lineNumber, methodName);
// 这里是自定义的统一返回格式
return ResponseJson.failure(e.getMessage());
}
}
当然,这个类还是为了处理我们没有预料到的异常,对于一些可能出问题的代码,我们还是要负责任的try catch并处理,而不是直接抛给前端返回。