SpringBoot中配置全局异常处理

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

先写一个错误请求

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

使用postman测试接口,结果如下
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

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

QQ截图20180317193043.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,985评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,842评论 25 709
  • 在我们平时的项目研发过程中,异常一般都是程序员最为头疼的问题,异常的抛出、捕获、处理等既涉及事务回滚,还会涉及返回...
    恒宇少年阅读 11,157评论 6 41
  • Z:第一次看见Z,刚毕业的大学生,阳光,却又有不与年龄相符的稳重!隐约间,似乎又觉得幼稚! @:这个名...
    老ZA阅读 597评论 0 0
  • 七月份,是北方迎来温热的时候。 草原上,是遍地的牛羊。 渴望看见你的微笑渴望,为你驻足与停留。 平静的看着草原草木...
    波米阅读 568评论 2 12