SpringBoot集成全局异常处理

SpringBoot集成全局异常处理

前言

对于一般的MVC项目,大量的异常须要咱们去处理,如此一来,咱们的 Controller 层就不得不进行 try-catch Service 层的异常,这样一来,Controller层每一个方法体都须要写一些模板化的try-catch代码,很是难看且冗余,还很差维护。git

HOW TO DO

正好这里涉及到两个annotation类:
* @ControllerAdvice 全局异常处理类,再也不须要每一个Controller里一必定义
* @ExceptionHandler 定义针对每种类型的Exception

固然啦,若是你在业务中已经try catch啦,那就别期望被处理了,你本身都处理了
别人固然不操心了

全局处理类:github

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
     
    @Autowired
    private AppResultManager res;//返回结果包装类
    
    /**
     * 参数校验失败Handler, 如使用 org.springframework.util.Assert 类校验失败的处理
     *
     * @param request HttpServletRequest
     * @param exception catch ConstraintViolationException
     */
    @ExceptionHandler(value = IllegalArgumentException.class)
    public String assertFailHandler(HttpServletRequest request,
            IllegalArgumentException exception) {
        return res.error(exception.getMessage());
    }
    //...省略其余方法
    /**
     * 全部异常报错 Handler, 兜底
     *
     * @param request HttpServletRequest
     * @param exception Exception
     * @throws Exception 错误
     */
    @ExceptionHandler(value = Exception.class)
    public String allExceptionHandler(HttpServletRequest request, Exception exception) 		{
        exception.printStackTrace();
        return res.error(exception.toString());
    }

}

测试代码:spring

@RestController
@RequestMapping(value = "/helloWorld")
public class HelloWorldController {

    @Autowired
    private AppResultManager res;

    @RequestMapping(value = "/test",method = RequestMethod.GET)
    public String testException(String userName, String callback) {
        Assert.notNull(userName, "userName can't found");
        return res.success(userName, callback);
    }
}

浏览器访问:浏览器

http://localhost:8080/helloWorld/test

优缺点

优势:将 Controller 层的异常和数据校验的异常进行统一处理,减小模板代码,减小编码量,提高扩展性和可维护性。 缺点:只能处理 Controller 层未捕获(往外抛)的异常,对于 Interceptor(拦截器)层的异常,Spring 框架层的异常,就无能为力了。app

结束

gitHub地址: https://github.com/Grit-tan/globalExceptionDemo框架

相关文章
相关标签/搜索