乐趣区

关于软件测试:技术分享-Spring-Boot-异常处理

  • Java 异样类
    首先让咱们简略理解或重新学习下 Java 的异样机制。

Java 外部的异样类 Throwable 包含了 Exception 和 Error 两大类,所有的异样类都是 Object 对象。

Error 是不可捕获的异样,艰深的说就是因为 Java 外部 JVM 引起的不可预感的异样,Java 虚构机会抉择终止线程。如 OutOfMemoryError , 就是 Java 虚拟机运行过程中呈现内存资源谬误抛出的。

Excetpion 异样是程序自身引起的,它又分为运行时异样 RuntimeException,和非运行时(编译时)IOException 等异样。如除数为零时引发的 ArrayIndexOutOfBoundException 异样就是运行时异样。非运行异样都是可查可捕获的。Java 编译器会通知程序他错了,错在哪里,正确的倡议什么。咱们能够通过 throws 配合 try-catch 来解决。

  • Java 异样解决机制
    在 Java 应用程序中,异样解决机制为:抛出异样,捕获异样。

抛出异样:当一个办法呈现谬误引发异样时,办法创立异样对象并交付运行时零碎,异样对象中蕴含异样类型和出现异常时的程序运行时信息。运行时零碎负责寻找处理异样的代码并执行。

捕捉异样:在办法抛出异样之后,运行时零碎将转为寻找适合的异样处理器(Exception Handler)。潜在的异样处理器是异样产生时顺次存留在调用栈中的办法的汇合。

当异样处理器能解决的异样类型与办法抛出的异样类型相符时,即为适合的异样处理器。运行时零碎从产生异样的办法开始,顺次回查调用栈中的办法,直至找到含有适合异样处理器的办法并执行。
当运行时零碎遍历调用栈而未找到适合 的异样处理器,则运行时零碎终止。同时,意味着 Java 程序的终止。

  • Spring Boot 异样解决
    Spring Boot 的所有异样解决都基于 java 的。

在 Spring Boot 应用程序中,通常对立解决异样的办法有 应用注解解决 RestControllerAdvice
本示例次要目标解决咱们日常 Spring Boot 中的异样解决

在 Web 我的项目中通过 ControllerAdvice、RestControllerAdvice 实现全局异样解决

ControllerAdvice 和 RestControllerAdvice 的区别 相当于 Controller 和 RestController 的区别。

代码示例

  • GlobalExceptionHandler.java

    import org.springframework.http.HttpStatus;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @RestControllerAdvice
    public class GlobalExceptionHandler {@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
      @ExceptionHandler({Exception.class})
      public Object exceptionHandler(Exception e){Map<String,Object> map=new HashMap<>();
          map.put("status",-1);
          map.put("msg",e.getLocalizedMessage());
          return map;
      }
    }
    
  • 配置介绍
    RestControllerAdvice:全局捕捉异样,异样集中处理,更好的使业务逻辑与异样解决剥来到,定义在类上

ExceptionHandler:对立解决某一类异样,申明该办法用于捕捉 value 所指的类型的异样(留神:当该异样的子父类都被申明时,依照先子后父的程序进行捕捉)

ResponseStatus:将某种异样映射为 HTTP 状态码,可用在办法上,也能够用在类上(自定义运行时异样类)。

  • HogwartsTestUserController.java
    在 HogwartsTestUserController.java 新增一个 error 接口
/**
     * 模仿抛出异样
     * */
    @GetMapping("/error")
    public Object err(){throw new RuntimeException("抛出一个异样");
    }

GET http://127.0.0.1:8081/api/use… 失常返回

{
    "id": 3,
    "name": "HogwartsTest2",
    "pwd": "HogwartsTest2"
}

GET http://127.0.0.1:8081/api/use… 抛出异样,并给出提示信息
{“msg”: “ 抛出一个异样 ”, “status”: -1}

退出移动版