SpringBoot中配置全局异常处理

在项目开发中,肯定少不了异常的出现,作为后台开发人员,我们总是在不停的写各种接口提供给前端调用,然而不可避免的,当后台出现BUG时,前端总是丑陋的讲错误信息直接暴露给用户,这样的用户体验想必是相当差的

先写一个错误请求

@GetMapping("api/error")
    public Object error(){
        int a=10/0;
        return a;
    }

使用postman测试接口,结果如下
SpringBoot中配置全局异常处理_第1张图片
QQ截图20180317190754.png

如果未添加全局异常处理,将会使用默认的异常处理,返回结果,返回的结果和自己的数据结构有很大的差异,对于前端处理返回结果也很麻烦,所以最好可以做个全局异常处理

@ControllerAdvice 处理全局异常

在处理controller层抛出的自定义异常时,可以实现@ControllerAdvice注解捕获。
@ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度
该注解作用对象为方法,并且在运行时有效,value()可以指定异常类。异常参数:包括一般的异常或特定的异常(即自定义异常),如果注解没有指定异常类,会默认进行映射。
@ControllerAdvice:异常集中处理,更好的使业务逻辑与异常处理剥离开

全局异常处理代码如下:

@ControllerAdvice
public class GloablExceptionHandler {
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public Object handleException(Exception e) {
        // 记录错误信息
        String msg = e.getMessage();
        if (msg == null || msg.equals("")) {
            msg = "服务器出错";
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("message", msg);
        return jsonObject;
    }
}

我这里直接用fastjson返回json数据,也可以自定义返回实体(比较推荐).
如果是想返回页面的话可以返回ModelAndView的对象,并且不用加@ResponseBody
如果全部异常处理返回json,那么可使用@RestControllerAdvice 代替@ControllerAdvice,这样在方法上就可以不需要添加 @ResponseBody

下面我们再次来看看异常的返回

SpringBoot中配置全局异常处理_第2张图片
QQ截图20180317193043.png

这样就按照我们自定义的格式返回异常信息了,返回的数据结构推荐自定义返回实体。

你可能感兴趣的:(SpringBoot中配置全局异常处理)