栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot项目异常捕捉全局异常、空指针、自定义异常、表单校验消息等

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot项目异常捕捉全局异常、空指针、自定义异常、表单校验消息等

场景:
在开发中,通常我们需要对异常分类捕捉处理,例如全局异常、空指针异常、运行时异常、自定义业务异常、springframework.validation验证表单消息等,捕捉记录日志文件后,再把捕捉到的异常消息统一响应到前端。这就需要我们配置相应的策略


捕捉异常并打印记录日志,代码如下:

package com.hkl.modules.exception;

import cn.hutool.core.util.ObjectUtil;
import com.hkl.enums.ResultCode;
import com.hkl.exception.BizException;
import com.hkl.vo.resp.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Optional;



@Slf4j
@ControllerAdvice
public class ExceptionAdvice {

    
    @ResponseBody
    @ExceptionHandler(value = {Exception.class})
    public CommonResult exceptionHandler(Exception ex) {
        log.info("捕捉的异常信息:" + ex.getMessage());
        //打印异常信息
        printStackTraceInfo(ex.getStackTrace());
        //获取servlet容器
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        return new CommonResult(ResultCode.FAIL.getCode(), ResultCode.FAIL.getMsg(), ex.getMessage(), request.getRequestURI());
    }

    
    @ResponseBody
    @ExceptionHandler(value = {NullPointerException.class})
    public CommonResult exceptionHandler(NullPointerException nullEx) {
        //打印异常信息。空指针异常比较特殊,必须放在下面一行代码 log.info() 之前才可以正常打印出异常类的路径(暂不知为何)
        printStackTraceInfo(nullEx.getStackTrace());
        log.info("捕捉的异常信息:" + nullEx.getMessage());
        //获取servlet容器
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        return new CommonResult(ResultCode.FAIL.getCode(), ResultCode.FAIL.getMsg(), String.valueOf(nullEx.getMessage()), request.getRequestURI());
    }

    
    @ResponseBody
    @ExceptionHandler(value = BizException.class)
    public CommonResult exceptionHandler(BizException bizEx) {
        log.info("捕捉的异常信息:" + bizEx.getMessage());
        //打印异常信息
        printStackTraceInfo(bizEx.getStackTrace());
        //获取servlet容器
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        return new CommonResult(ResultCode.FAIL.getCode(), ResultCode.FAIL.getMsg(), bizEx.getMessage(), request.getRequestURI());
    }

    
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public CommonResult exceptionHandler(MethodArgumentNotValidException ex) {
        log.error("异常信息:{}", ex.getMessage());
        //打印异常信息
        printStackTraceInfo(ex.getStackTrace());
        //获取Servlet容器
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        //获取request请求
        HttpServletRequest request = attributes.getRequest();

        CommonResult commonResult = new CommonResult<>();
        return commonResult
                .setCode(ResultCode.FAIL.getCode())
                .setMessage(ResultCode.FAIL.getMsg())
                .setPath(request.getRequestURI())
                .setData(ex.getBindingResult().getFieldError().getDefaultMessage());
    }


    
    private void printStackTraceInfo(StackTraceElement[] stackTraceElements){
        log.error("追踪栈异常信息:");
        for(StackTraceElement stackTraceElement : Optional.ofNullable(stackTraceElements).orElse(new StackTraceElement[0])){
            if(ObjectUtil.isNotNull(stackTraceElement)){
                String errMsg = String.valueOf(stackTraceElement);
                //只打印此项目业务中捕捉到的异常信息
                if(errMsg.contains("com.hkl")){
                    log.error(errMsg);
                }
            }
        }
    }


}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/605649.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号