SpringBoot异常处理——业务逻辑异常

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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全局异常处理

SpringBoot-@ControllerAdvice 拦截异常并统一处理

SpringBoot | 第八章:统一异常数据校验处理

java业务层发生异常,但是数据却没有回滚的几种常见情况

java业务层发生异常,但是数据却没有回滚的几种常见情况

SpringBoot项目中异常的捕获和处理