【SpringBoot】springboot实现全局异常捕获

这篇具有很好参考价值的文章主要介绍了【SpringBoot】springboot实现全局异常捕获。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

导言:

为什么要做异常处理:
原因有三:
1、将系统产生的全部异常统一捕获处理。

2、自定义异常需要由全局异常来捕获。

3、JSR303规范的validator参数校验器、参数校验不通过、本身无法使用try…catch

其实对于前后端分离的项目做异常处理是很有必要的
在不出异常的情况下,后端将数据封装成固定格式(也就是R类)返回给前端,方便前端去解析数据
例如如下R类:

@Data
public class R<T> implements Serializable {

    private Integer code; //编码:1成功,0和其它数字为失败

    private String msg; //错误信息

    private T data; //数据

    private Map map = new HashMap(); //动态数据

    public static <T> R<T> success(T object) {
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;
        return r;
    }
    public static <T> R<T> success(String msg,T object) {
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;
        r.msg = msg;
        return r;
    }

    public static <T> R<T> error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }

    public static <T> R<T> success(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 1;
        return r;
    }

    public R<T> add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }

}

正常不出异常的情况下根据controller层返回的数据:
controller层

    //正常情况
    @GetMapping("/hhy/1")
    public R info(){
        int i = 60/1;
        return R.success("成功",i);
    }

请求成功返回给前端数据:
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端
在出异常的情况下(模拟除0异常):
controller层

    //空指针异常
    @GetMapping("/hhy/2")
    public R info2(){
        int i = 60/0;
        return R.success("成功",i);
    }

出现异常前端拿不到数据,并且后端报错:
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端
前端:
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端
后端:
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端

这样虽然后端可以知道异常情况,但是前端就难受了,啥也不知道,就知道出错了;

重点来了!!!!!

这里就可以体现全局异常处理器的重要性了;让前端的兄弟好受一点。

实现全局异常处理器捕获异常

举例:异常还是除0 异常:

java.lang.ArithmeticException: / by zero

这里的异常就是ArithmeticException,异常信息为/ by zero

编写全局异常捕获类:GlobalExceptionHandler

/**
 * 全局异常捕获
 */
@Slf4j
@ControllerAdvice(annotations = {RestController.class, Controller.class})
//只要类的注解上有这些注解。那么发生的异常都能被捕获到
@ResponseBody
public class GlobalExceptionHandler {
    /**
     * 处理除0异常捕获
     * @param exception
     * @return
     */
    @ExceptionHandler(ArithmeticException.class)//ArithmeticException异常类型通过注解拿到
    public R<String> exceptionHandler(ArithmeticException exception){
            log.error(exception.getMessage());//在控制台打印错误信息
                return R.error(exception.getMessage());

    }
}

此时在controller层出现ArithmeticException(除0)异常时就会被全局异常处理器捕获到:
后端::相比之前一大串报错,是不是很清爽
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端
前端:

在异常处理器里面已将错误信息封装成返回类R返回给前端

springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端

相比之前返回给前端的一大串杂七杂八的,这个是不是超级清爽,并且可以根据code码在前端将错误信息设置警告框

springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端

这样前端的兄弟看到信息就知道,嗷嗷 后端出问题了 问题是除0异常,这样就可以安心的去甩锅给后端的哥们了;

实现原理:

想必注意到这个注解:

@ControllerAdvice(annotations = {RestController.class, Controller.class})

意思只要类的注解上有这些注解。那么发生的异常都能被捕获到,例如例子中出现的异常的类的注解为:
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端

异常捕获类的@ResponseBody注解

当我们在全局异常处理中使用@ResponseBody注解时,它可以将异常信息序列化为JSON或其他格式的字符串,并作为HTTP响应的Body部分返回给客户端。

这就是为什么前端的兄弟能看到如此清爽的返回数据格式:
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端
不加@ResponseBody那就智能看到又臭又长的这个:
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端

@ExceptionHandler(ArithmeticException.class)

具体拦截类上的@ExceptionHandler注解主要是指定去捕获哪一种异常,这个很好理解

需要拦截捕获哪一类异常就去指定具体的类异常,捕获原理如上;

but··························

那么如果用户在操作的时候,出现一些有违背业务逻辑的情况下,我们也视为操作异常,抛出自定义的异常,返回给前端,然后告诉用户不能这么操作

自定义异常处理

1、首先要编写异常自定义处理类:

CustomException

public class CustomException extends RuntimeException{
    /**
     *  自定义业务异常类
     * @param message
     */
    public CustomException(String message){
        super(message);
        log.info(message.toString());
    }
}

这里将业务层抛出的异常信息捕获到,然后归类为runtime运行时异常,
然后交给全局异常处理器去处理,给前端提供错误信息

2、在全局异常类里面去捕获自定义异常CustomException

 /**
     * 将业务层抛出的异常信息捕获到,然后交给全局异常处理器去处理,给前端提供错误信息
     * @param exception
     * @return
     */
    @ExceptionHandler(CustomException.class)//RuntimeException异常类型通过注解拿到
    public R<String> exceptionCategoryDelete(CustomException exception){
        log.error(exception.getMessage());//在控制台打印错误信息
            return R.error(exception.getMessage());

    }

原理上面已经讲过了,不在赘述

那我们来测试一下,在业务层抛出一个CustomException ,看能不能被全局异常类捕获到:
后端:
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端

前端:
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端
springboot全局异常捕获,面试题合集,Java,# SpringBoot,spring boot,状态模式,后端

这样我们就可以愉快的解决异常问题了

这里稍稍解释下@ControllerAdvice注解

@ControllerAdvice注解是基于Spring框架的AOP(面向切面编程)实现的。AOP是一种编程范式,它通过在应用程序运行时,将横跨多个组件的行为进行分离和管理。

在Spring框架中,通过AOP可以将一些通用的横切关注点(比如异常处理、日志记录等)从业务逻辑中剥离出来,并以声明的方式进行集中管理。@ControllerAdvice注解就是利用了AOP的机制,在应用程序的控制器层进行统一的全局异常处理和数据绑定。

底层实现上,@ControllerAdvice注解使用了Spring的核心功能之一:切面(Aspect)和增强(Advice)。通过定义一个带有@ControllerAdvice注解的类,并在其中定义不同类型的增强(比如@ExceptionHandler注解用于异常处理),Spring会在运行时动态生成代理对象,将增强逻辑织入到目标控制器的方法调用中。

总结来说,@ControllerAdvice注解的底层实现基于Spring框架的AOP机制,通过切面和增强的方式,实现了全局异常处理和数据绑定的功能。文章来源地址https://www.toymoban.com/news/detail-655625.html

到了这里,关于【SpringBoot】springboot实现全局异常捕获的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 全局异常统一处理:BindException(绑定异常)

    在Spring Boot应用中,数据绑定是一个至关重要的环节,它负责将HTTP请求中的参数映射到控制器方法的入参对象上。在这个过程中如果遇到问题,如参数缺失、类型不匹配或验证失败等,Spring MVC将会抛出一个 org.springframework.validation.BindException 异常。本文将深入解析 BindExceptio

    2024年01月18日
    浏览(42)
  • SpringBoot全局异常页面处理学习

    首先我们先在控制器中写一个异常,默认情况下我们的SpringBoot异常页面是这个样子的。 示例代码如下:  一、自定义静态异常页面 自定义静态异常页面,我们可以分成两种方式,第一种就是使用HTTP状态码来命名页面,例如404.html,403.html,500html等。另一种就是直接定义一个4

    2024年02月09日
    浏览(49)
  • SpringBoot全局异常处理 | Java

    ⭐ 简单说两句 ⭐ 作者: 后端小知识 CSDN 个人主页 :后端小知识 🔎 GZH : 后端小知识 🎉 欢迎关注 🔎 点赞 👍 收藏 ⭐️ 留言 📝 亲爱的友友们,我们今天来讲一讲 SpringBoot 的全局异常处理吧😎 🎨什么是全局异常? 全局异常指的是在程序运行过程中发生的非预期异常,

    2024年02月08日
    浏览(37)
  • uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -全局异常统一处理实现

    锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2+vue3.2+element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibili uniapp微信小程序投票系统实战课程 (SpringBoot2+vue3.2+element plus ) ( 火爆连载更新中... )共计21条视频,包括:uniapp微信小程序投票系统实

    2024年02月03日
    浏览(42)
  • springboot全局异常处理和自定义异常处理

    在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。 GlobalExceptionHandler类: 自定义异常CustomException类: 通用返回类:AjaxResult 枚举类ResultCodeEnum:

    2024年02月04日
    浏览(43)
  • SpringBoot 全局异常处理——解决404/500

    SpringBoot要全局处理 Spring Boot 应用程序中的 HTTP 404 和 500 错误,您可以自定义一个异常处理器类,并使用 @ControllerAdvice 和 @ExceptionHandler 注释来拦截和处理这些异常。 下面是一种可能的实现方式,它捕获 HTTP GET请求 中 PathVariable 参数类型不匹配、参数格式错误以及其他所有未

    2024年02月06日
    浏览(37)
  • springboot优雅的统一返回格式 + 全局异常处理(包括404等异常)

    目录 1.自定义枚举类 2.自定义统一返回格式类 3.统一返回格式的高级实现 4.全局异常处理 5.更优雅的全局异常处理 6.处理404错误 该枚举类为我们和前端约定好的返回状态码和描述信息,可根据自己的需求修改状态码和描述 @Data 注解为Lombok工具类库中的注解,提供类的get、s

    2024年02月11日
    浏览(42)
  • 一张思维导图带你学会Springboot创建全局异常、自定义异常

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 在开发中,都离不开自定义异常、全局处理异常的使用。比如说在一些网站中看到的系统异常,请联系管

    2024年02月14日
    浏览(46)
  • 解决SpringBoot项目中@RestControllerAdvice全局异常失效问题

    使用@RestControllerAdvice添加了全局异常,但没有生效 方式1:@ExceptionHandler 所在类没有被Spring管理 因为 @SpringbootApplication默认扫描本包和子包,为了防止 全局异常类未被扫描到,建议在启动类上加上包扫描 方式2:AOP process() 没有异常抛出,自然不会被拦截掉。检查项目中的切面

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包