SpringBoot全局处理异常并记录异常日志

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并处理,而不是直接抛给前端返回。

你可能感兴趣的:(java开发,spring,boot,java,spring)