SpringBoot学习——全局处理异常

本文介绍了在SpringBoot项目中如何进行全局异常处理,包括自定义异常模板和引入第三方库的方式。通过自定义异常和使用@ControllerAdvice、@ExceptionHandler注解,可以统一异常信息的返回格式,提高用户体验。同时,文章还探讨了利用第三方库简化异常处理的方法。
摘要由CSDN通过智能技术生成

实际项目开发中,程序往往会发生各式各样的异常情况,特别是身为服务端开发人员的我们,总是不停的编写接口提供给前端调用,分工协作的情况下,避免不了异常的发生,如果直接将错误的信息直接暴露给用户,这样的体验可想而知,且对黑客而言,详细异常信息往往会提供非常大的帮助…

初窥异常

一个简单的异常请求的接口

    @GetMapping("/test")
    public String test() {
   
        // TODO 这里只是模拟异常,假设业务处理的时候出现错误了,或者空指针了等等...
        int i = 10/0;
        return "test1";
    }

通过swagger调用:

{
   
  "timestamp": "2019-01-28T06:38:42.517+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "/ by zero",
  "path": "/order/test"
}

如果这接口是给第三方调用或者是自己公司的系统,看到这种错误估计得暴走吧….

全局处理异常(自己定义返回模板)
自定义异常

在应用开发过程中,除系统自身的异常外,不同业务场景中用到的异常也不一样,为了与标题 轻松搞定全局异常 更加的贴切,定义个自己的异常,看看如何捕获…

/**
 * 自定义异常
 */
public class BusinessErrorException extends RuntimeException {
   

    private int code;

    public BusinessErrorException() {
   
        super();
    }

    public BusinessErrorException(ErrorCodeEnum errorCodeEnum) {
   
        super(errorCodeEnum.getMsg());
        this.setCode(errorCodeEnum.getCode());
    }

    public int getCode() {
   
        return code;
    }

    public void setCode(int code) {
   
        this.code = code;
    }
}
异常信息模板

定义返回的异常信息的格式,这样异常信息风格更为统一。

public class ErrorResponseEntity {
   
    private int code;

    private String message;

    public ErrorResponseEntity(int code, String message) {
   
        this.code = code;
        this.message = message;
    }

    public int getCode() {
   
        return code;
    }

    public void setCode(int code) {
   
        this.code = code;
    }

    public String getMessage() {
   
        return message;
    }

    public void setMessage(String message) {
   
        this.message = message;
    }
}
控制层

仔细一看是不是和平时正常写的代码没啥区别,不要急,接着看….

    @GetMapping("/test")
    public String test(@RequestParam int num) {
   
        if(num < 0) {
   
            throw new BusinessErrorException(ErrorCodeEnum.MY_TEST_EXCEPTION);
        }
        int i = 10/num;
        return "result" + i;
    }
异常处理(关键)

注解概述

  • @ControllerAdvice 捕获 Controller 层抛出的异常,如果添加 @ResponseBody 返回信息则为JSON格式。
  • @RestControllerAdvice 相当于 @ControllerAdvice 与 @ResponseBody 的结合体。
  • @ExceptionHandler 统一处理一种类的异常,减少代码重复率,降低复杂度。

创建一个 GlobalExceptionHandler 类,并添加上 @RestControllerAdvice 注解就可以定义出异常通知类了,然后在定义的方法中添加上 @ExceptionHandler 即可实现异常的捕捉…

@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
   


    /**
     * 定义要捕获的异常 可以多个 @ExceptionHandler({})
     *
     * @param request  request
     * @param e        exception
     * @param response response
     * @return 响应结果
     */
    @ExceptionHandler(BusinessErrorException.class)
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Spring Boot中,可以通过自定义全局异常处理器来处理应用程序中的异常。以下是一种常见的实现方式: 1. 创建一个自定义的异常处理器类,例如 `GlobalExceptionHandler`。 ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { // 处理异常逻辑 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error"); } @ExceptionHandler(YourCustomException.class) public ResponseEntity<String> handleYourCustomException(YourCustomException ex) { // 处理自定义异常逻辑 return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); } // 可以继续添加其他的异常处理方法 } ``` 2. 在 `GlobalExceptionHandler` 类上使用 `@ControllerAdvice` 注解,以告诉Spring该类为全局异常处理器。 3. 在 `handleException` 方法中,可以根据不同的异常类型进行处理,例如返回不同的HTTP状态码和错误信息。 4. 如果有自定义的异常,可以在 `GlobalExceptionHandler` 类中添加对应的异常处理方法。 5. 在异常发生时,Spring Boot将会调用匹配的异常处理方法来处理异常。如果没有匹配的方法,将会调用默认的异常处理方法。 这样,当应用程序中出现异常时,就会被全局异常处理器捕获,并根据相应的处理逻辑返回错误响应。 注意:以上只是一种实现方式,你可以根据具体需求进行自定义。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值