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;
    }
}

测试结果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们再加上局部异常,再进行测试:

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45525272/article/details/126816602