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