SpringBoot业务逻辑异常的处理方法介绍

 更新时间:2022年09月13日 10:22:18   作者:流楚丶格念  
本篇文章为大家展示了如何在SpringBoot中统一处理逻辑异常,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获

在Spring Boot项目中除了设置错误页面,还可以通过注解实现错误处理。

局部异常

局部异常:

在控制器类中添加一个方法,结合@ExceptionHandler。但是只能对当前控制器中方法出现异常进行解决。

引入lombok依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

1.创建异常信息类

package com.yyl.firstdemo.exception;
import lombok.Data;
@Data
public class ExceptionMessage {
    private String code;
    private String message;
}

2.在controller中设置异常处理

package com.yyl.firstdemo.controller;
import com.yyl.firstdemo.exception.ExceptionMessage;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class ErrorController {
    @RequestMapping("/test")
    public String testError(){
        System.out.println(5/0);
        return "500";
    }
    @ExceptionHandler(ArithmeticException.class)
    @ResponseBody
    public ExceptionMessage arithmeticException(Exception e){
        ExceptionMessage exceptionMessage = new ExceptionMessage();
        exceptionMessage.setCode("500");
        exceptionMessage.setMessage(e.getMessage());
        return exceptionMessage;
    }
}

@ExceptionHandler的参数为发生异常的类型。如果controller的方法中捕获到了这种异常,就会走@ExceptionHandler表示的方法arithmeticException(),在方法参数中,可以获取异常对象。

最终执行结果:

当访问test的controller方法时,会出现除0异常,就会走异常处理方法,封装异常信息,返回,错误类封装的状态信息。

全局异常

新建全局异常类,通过@ControllerAdvice结合@ExceptionHandler。当全局异常处理和局部处理同时存在时,局部生效(就近原则)

编写全局异常处理器:

package com.yyl.firstdemo.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class GlobalExceptionHandleController {
    //发生除0异常时,会执行该方法
    @ExceptionHandler(ArithmeticException.class)
    @ResponseBody
    public ExceptionMessage arithmeticException(Exception e){
        ExceptionMessage exceptionMessage = new ExceptionMessage();
        exceptionMessage.setCode("500");
        exceptionMessage.setMessage(e.getMessage());
        return exceptionMessage;
    }
    //发生空指针异常时会执行该方法
    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public ExceptionMessage nullPointerException(NullPointerException
                                                         e){
        ExceptionMessage exceptionMessage = new ExceptionMessage();
        exceptionMessage.setCode("500");
        exceptionMessage.setMessage(e.getMessage());
        return exceptionMessage;
    }
    //发生其他未知异常时,会执行该方法
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ExceptionMessage otherException(){
        ExceptionMessage exceptionMessage = new ExceptionMessage();
        exceptionMessage.setCode("500");
        exceptionMessage.setMessage("发生了其他未知异常!");
        return exceptionMessage;
    }
}

编写controller,增加两个方法:

package com.yyl.firstdemo.controller;
import com.yyl.firstdemo.exception.ExceptionMessage;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class ErrorController {
    @RequestMapping("/test")
    public String testError(){
        System.out.println(5/0);
        return "500";
    }
    @RequestMapping("/testNull")
    public String testNull(){
        String s = null;
        System.out.println(s.length());
        return null;
    }
    @RequestMapping("testOther")
    public String testOther(){
        int[] arr = new int[3];
        System.out.println(arr[5]);
        return null;
    }
}

测试结果如下:

我们再加上局部异常,再进行测试:

我们发现就近原则生效,异常被局部异常处理器捕获处理

到此这篇关于SpringBoot业务逻辑异常的处理方法介绍的文章就介绍到这了,更多相关SpringBoot业务逻辑异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis foreach 循环 list(map)实例

    mybatis foreach 循环 list(map)实例

    这篇文章主要介绍了mybatis foreach 循环 list(map)实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 浅谈Java文件执行顺序、main程序入口的理解

    浅谈Java文件执行顺序、main程序入口的理解

    这篇文章主要介绍了Java文件执行顺序、main程序入口的理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 详解Java中Period类的使用方法

    详解Java中Period类的使用方法

    Period类通过年、月、日相结合来描述一个时间量,最高精度是天。本文将通过示例详细为大家讲讲Period类的使用,需要的可以参考一下
    2022-05-05
  • shiro与spring security用自定义异常处理401错误

    shiro与spring security用自定义异常处理401错误

    这篇文章主要介绍了shiro与spring security用自定义异常处理401错误,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • JavaWeb ServletConfig作用及原理分析讲解

    JavaWeb ServletConfig作用及原理分析讲解

    ServletConfig对象,叫Servlet配置对象。主要用于加载配置文件的初始化参数。我们知道一个Web应用里面可以有多个servlet,如果现在有一份数据需要传给所有的servlet使用,那么我们就可以使用ServletContext对象了
    2022-10-10
  • java中利用反射调用另一类的private方法的简单实例

    java中利用反射调用另一类的private方法的简单实例

    下面小编就为大家带来一篇java中利用反射调用另一类的private方法的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • SpringBoot+Redis海量重复提交问题解决

    SpringBoot+Redis海量重复提交问题解决

    在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,所以本文介绍一下SpringBoot+Redis海量重复提交问题解决,感兴趣的可以了解一下
    2023-12-12
  • Java连接Vmware中的redis

    Java连接Vmware中的redis

    这篇文章主要为大家介绍了Java连接Vmware中的redis
    2016-01-01
  • Spring Boot前后端分离开发模式中的跨域问题及解决方法

    Spring Boot前后端分离开发模式中的跨域问题及解决方法

    本文介绍了解决Spring Boot前端Vue跨域问题的实战经验,并提供了后端和前端的配置示例,通过配置后端和前端,我们可以轻松解决跨域问题,实现正常的前后端交互,需要的朋友可以参考下
    2023-09-09
  • SpringBoot+mybatis+thymeleaf实现登录功能示例

    SpringBoot+mybatis+thymeleaf实现登录功能示例

    这篇文章主要介绍了SpringBoot+mybatis+thymeleaf实现登录功能示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论