springboot 全局异常处理和统一响应对象的处理方式


Posted in Java/Android onJune 28, 2022

springboot异常处理

SpringBoot 默认的异常处理机制

默认情况,SpringBoot 提供两种不同响应方式

  • 一种是浏览器客户端请求一个不存在的页面或服务端异常时,SpringBoot默认会响应一个html
  • 另一种是使用postman等调试工具请求不存在的url或服务端异常时,默认返回json信息

SpringBoot 全局异常处理

一般我们不会将错误信息返回前端,自己去try catch捕获异常,但有个问题:每个方法都这样捕获异常,肯定是不合适,这是我们就需要全局的异常处理了。

@RestController
public class ExceptionController {
    @GetMapping("exceptionA")
    public void methodA() {
        try {
            int a = 100 / 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1. 局部异常处理

使用@EceptionHandle注解实现某个类的局部异常处理

@RestController
   public class ExceptionController {
   
       @GetMapping("exceptionA")
       public void methodA() {
           int a = 100 / 0;
       }
   
       /**
        * 局部异常处理
        */
       @ExceptionHandler(Exception.class)
       public String exHandler(Exception e) {
           // 判断发生异常的类型是除0异常则做出响应
           if (e instanceof ArithmeticException) {
               return "发生了除0异常";
           }
           // 未知的异常做出响应
           return "发生了未知异常";
       }
   }

2. 全局异常处理

使用@ControllerAdvice +@ExceptionHandler注解实现全局异常处理

自定义一个异常类

@RestControllerAdvice
public class DefaultException {
​
    @ExceptionHandler({NullPointerException.class})
    public String exception(NullPointerException exception) {
        return "空指针异常";
​
    }
​
    @ExceptionHandler({IndexOutOfBoundsException.class})
    public String exception(IndexOutOfBoundsException exception) {
        return "数组越界异常";
    }
}

增加一个异常方法测试,由于局部异常优先级更高先注释掉了

@RestController
public class ExceptionController {
​
    @GetMapping("exceptionA")
    public void methodA() {
        int a = 100 / 0;
    }
​
    @GetMapping("exceptionB")
    public void methodB() {
        List list = new ArrayList<>();
        System.out.println(list.get(0));
    }
​
    /**
     * 局部异常处理
     */
    //@ExceptionHandler(Exception.class)
    //public String exHandler(Exception e) {
    //    // 判断发生异常的类型是除0异常则做出响应
    //    if (e instanceof ArithmeticException) {
    //        return "发生了除0异常";
    //    }
    //    // 未知的异常做出响应
    //    return "发生了未知异常";
    //}
}

全局异常注解已生效

自定义异常

自定义异常只需要继承exception类或其子类

@Data
@NoArgsConstructor
public class CustomException extends Exception {
​
    private static final long serialVersionUID = 1L;
​
    private Integer code;
​
    private String mes;
​
    /**
     * @param code 状态码
     * @param msg  异常返回信息
     * @description 构造器
     */
    public CustomException(Integer code, String msg) {
        super(msg);
        this.code = code;
    }
}

使用时可以直接抛出异常对象

@GetMapping("exceptionC")
public void methodC() throws CustomException {
    int a = 1;
    if (a == 1) {
        throw new CustomException(10086, "自定义异常");
    }
}

统一响应对象

实际开发中我们需要封装统一的响应对象,区分状态码和信息,以便前端处理。

定义统一的响应对象

一般包含状态码,错误信息,数据等。

自定义一些方法用来返回信息,比如我定义的success(),failed()方法

@Data
@NoArgsConstructor
@AllArgsConstructor
public class R<T> {
    /**
     * 返回状态码
     */
    private Integer code;
    /**
     * 返回信息
     */
    private String msg;
    /**
     * 数据
     */
    private T data;
​
    public static R success() {
        return new R(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMsg(), null);
    }
​
    public static R success(Object data) {
        return new R(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMsg(), data);
    }
​
    public static R failed() {
        return new R(ResultCode.FAILED.getCode(), ResultCode.FAILED.getMsg(), null);
    }
​
    public static R failed(String msg) {
        return new R(ResultCode.FAILED.getCode(), msg, null);
    }
​
    public static R failed(int code, String msg) {
        return new R(code, msg, null);
    }
}

枚举信息

枚举一些常用的状态信息

我就举个例子,只枚举2个,根据需要去自定义

@NoArgsConstructor
@AllArgsConstructor
public enum ResultCode {
​
    SUCCESS(200, "请求成功"),
    FAILED(500, "服务器错误");
​
    private int code;
    private String msg;
​
    public int getCode() {
        return code;
    }
​
    public void setCode(int code) {
        this.code = code;
    }
​
    public String getMsg() {
        return msg;
    }
​
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

响应对象

使用时直接返回定义的对象类型就行了,将定义的全局异常返回类型也改成统一的响应对象

@RestControllerAdvice
public class DefaultException {
    @ExceptionHandler({CustomException.class})
    public R exception(CustomException e) {
        return R.failed(e.getCode(),e.getMessage());
    }

    @ExceptionHandler({Exception.class})
    public R exception(Exception e) {
        return R.failed(e.getMessage());
    }
}

全局异常和响应对象的简单介绍就这样了,欢迎补充指正。

gitee地址:gitee.com/rainscloud/…

到此这篇关于springboot 全局异常处理和统一响应对象的文章就介绍到这了,更多相关springboot全局异常处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Java/Android 相关文章推荐
Java图书管理系统,课程设计必用(源码+文档)
Jun 30 Java/Android
SpringBoot 拦截器妙用你真的了解吗
Jul 01 Java/Android
SpringBoot整合Mybatis Generator自动生成代码
Aug 23 Java/Android
java调用Restful接口的三种方法
Aug 23 Java/Android
SpringCloud之@FeignClient()注解的使用方式
Sep 25 Java/Android
java协程框架quasar和kotlin中的协程对比分析
Feb 24 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 Java/Android
Java详细解析==和equals的区别
Apr 07 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 Java/Android
Spring Boot 实现 WebSocket
Apr 30 Java/Android
Android studio 简单计算器的编写
May 20 Java/Android
Java实现贪吃蛇游戏的示例代码
Sep 23 Java/Android
详解Spring Security如何在权限中使用通配符
Jun 28 #Java/Android
Android RecyclerView实现九宫格效果
Jun 28 #Java/Android
Java 多线程并发FutureTask
Java+swing实现抖音上的表白程序详解
Jun 25 #Java/Android
Java Spring Boot请求方式与请求映射过程分析
Jun 25 #Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 #Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 #Java/Android
You might like
第十四节 命名空间 [14]
2006/10/09 PHP
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
php curl批处理实现可控并发异步操作示例
2018/05/09 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
js 数据类型转换总结笔记
2011/01/17 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
2019/11/20 Javascript
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
详解Python当中的字符串和编码
2015/04/25 Python
Python中的getopt函数使用详解
2015/07/28 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
基于Python的PIL库学习详解
2019/05/10 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
汽车制造与装配专业自荐信范文
2014/01/02 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
创新社会管理心得体会
2014/09/12 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
禁毒心得体会范文
2016/01/15 职场文书
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers