SpringBoot全局异常处理方式

每个项目全局异常处理非常重要, 今天在处理项目架构的时候添加了一个全局异常处理。

大概三种异常情况:

一:在进入Controller之前,譬如请求一个不存在的地址,404错误。 
二:在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。 
三:以上都正常时,在controller里执行逻辑代码时出的异常。譬如NullPointerException。 

@RestController
public class FinalExceptionHandler implements ErrorController {
    @Override
    public String getErrorPath() {
        return "/error";
    }

    @RequestMapping(value = "/error")
    public Object error(HttpServletResponse resp, HttpServletRequest req) {
        // 错误处理逻辑
        return "其他异常";
    }
}

二、三

import static org.springframework.http.HttpStatus.NOT_EXTENDED;

/**
 * Created by mazhq on 2018/7/10
 * 全局异常处理
 */
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 在controller里面内容执行之前,校验一些参数不匹配啊,Get post方法不对啊之类的
     */
    @Override
    protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
        System.out.println("错误");
        return new ResponseEntity<Object>(BaseCode.retCode(ResultCode.parmFarmat).toString(), NOT_EXTENDED);
    }

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public String jsonHandler(HttpServletRequest request, Exception e) {
        logger.error("请求路径:"+request.getRequestURL().toString()+"; 发生错误!");
        log(e, request);
        return BaseCode.retCode(ResultCode.failure).toString();
    }

    private void log(Exception ex, HttpServletRequest request) {
        logger.error("************************异常开始*******************************");

        logger.error("异常信息:", ex);
        logger.error("请求地址:" + request.getRequestURL());
        Enumeration enumeration = request.getParameterNames();
        logger.error("请求参数");
        while (enumeration.hasMoreElements()) {
            String name = enumeration.nextElement().toString();
            logger.error(name + "---" + request.getParameter(name));
        }

        StackTraceElement[] error = ex.getStackTrace();
        for (StackTraceElement stackTraceElement : error) {
            logger.error(stackTraceElement.toString());
        }
        logger.error("************************异常结束*******************************");
    }
}

  

这两个方法基本可以解决未处理异常问题,在其中可以添加自己的业务逻辑,自由发挥。

 

posted @ 2018-07-10 16:01  森林木马  阅读(4691)  评论(0编辑  收藏  举报