SpringBoot全局异常捕获处理实现方案

在Spring Boot中实现全局异常处理可以通过以下方式:

  1. 使用@ControllerAdvice注释创建一个全局异常处理类,并使用@ExceptionHandler注释来定义具体异常的处理方法。
import your.package.IllegalNumberException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @class GlobalExceptionHeadler
 * @date 2021/8/28 13:41
 */
@ControllerAdvice
public class GlobalExceptionHeadler {

    //处理指定异常
    @ExceptionHandler(value = IllegalNumberException.class)//IllegalNumberException 自定义异常
    @ResponseBody
    public ResponseEntity<String> illegalNumberExceptionHeadler(Exception e){
        System.out.println("进入非法参数异常处理");
        return new ResponseEntity<>(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR);
    }

    //处理exceptioin子类异常
    @ExceptionHandler(value = Exception.class)//作用方法上,作用:用来处理指定异常; value属性:用来处理指定类型的异常
    @ResponseBody
    public ResponseEntity<String> exceptionHeadler(Exception e){
        //if(e instanceof IllegalNumberException){} 等价于 上面的方法处理指定异常
        System.out.println("进入自定义异常处理");
        return new ResponseEntity<>(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
  1. 自定义异常
/**
 * @class IllegalNumberException
 * @date 2021/8/28 14:05
 */
public class IllegalNumberException extends RuntimeException{
    public IllegalNumberException(String message){
        super(message);
    }
}
  1. Controller
import your.package.IllegalNumberException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class Test2Controller {
    

    @GetMapping("/testException")
    public ResponseEntity<String> demo(){
        int i = 1/0;
        return new ResponseEntity<>("ok", HttpStatus.OK);
    }

    @GetMapping("/testIllegalNumberException/{id}")
    public ResponseEntity<String> demo(@PathVariable("id") Integer id){
        if(id < 0){
            throw new IllegalNumberException("无效id,请检查");
        }
        return new ResponseEntity<>("ok", HttpStatus.OK);
    }


}
  1. Postman测试效果

通用异常:
SpringBoot全局异常捕获处理实现方案_第1张图片

自定义异常:
SpringBoot全局异常捕获处理实现方案_第2张图片
5. 总结
在以上代码片段中,使用了 @ExceptionHandler 注解来指定该方法会处理哪种类型的异常。方法体中,你可以自定义返回给用户的响应,包括HTTP状态码和返回信息。使用 @ControllerAdvice 注解可以确保它会接收到由控制器抛出的异常。

如果需要更多具体的自定义设置,还可以在响应里添加 headers 信息,或者创建更复杂的响应体,例如使用ResponseEntity。官方的 Spring 框架文档提供了和这个主题相关的更多高级选项和最佳实践指南。

你可能感兴趣的:(知识分享,spring,boot,后端,java)