2023年11月29日发(作者:)
java实现统⼀异常处理
对于Dao层 和Service产⽣的异常要⼀直⽹上抛,直⾄Controller层,但是对于controller层不能处理的异常也不能直接抛给前端。
为什么不能在service处理异常?
答:Service 层往往涉及数据库事务,出现异常同样不适合捕获,否则事务⽆法⾃动回滚。此外 Service 层涉及业务逻辑,有些业务逻辑执
⾏中遇到业务异常,可能需要在异常后转⼊分⽀业务流程。如果业务异常都被框架捕获了,业务功能就会不正常。【引⽤:极客时间的Java
业务开发常见错误100例】
实现统⼀异常处理:
在spring框架下实现⼀个异常处理的类,⽤ @RestControllerAdvice + @ExceptionHandler
进⾏修饰:
即@RestControllerAdvice默认会拦截 controller类上抛出的不能处理的异常
⼀个全局异常处理类需要处理三类异常: 1.业务类异常,2.运⾏时异常 ,
1.运⾏时异常
/**
* @创建⼈: liup
* @创建时间: 2021/6/18
* @描述 全局异常捕获处理类
*/
注意:这是要返回给前端的,msg的内容,是对⽤户⼗分不友好的。
RuntimeException只是异常中的⼀个类,不能包含所有的异常体系,还有⼀⼤类是叫Error(系统级异常),所以需要有⼀个兜底的异常
捕获:
/**
* @Author: liup
* @date: 2021/6/18 15:01
⽅法实现说明: 捕获系统级异常
*/
@ExceptionHandler(value = )
public R throwableHandle(Throwable th){
/**
* @创建⼈: liup
* @创建时间: 2021/6/18
* @描述 业务类异常
*/
public class BusinessException extends RuntimeException{
@Getter
private final String code;
/**
* @Author: liup
* @date: 2021/6/18 15:10
⽅法实现说明: 根据消息码【可⽤枚举类】 构造业务类异常
*/
public BusinessException(String code) {
= code;
}
/**
* @创建⼈: liup
* @创建时间: 2021/6/18
* @描述 全局异常捕获处理类
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* @Author: liup
* @date: 2021/6/18 15:14
⽅法实现说明: 拦截业务类异常
*/
@ExceptionHandler(value = )
public R businessExceptionHandle(BusinessException e){
("捕获业务类异常:",e);
return ("业务类异常:"+sage());
}
private static int GENERIC_SERVER_ERROR_CODE = 2000;
private static String GENERIC_SERVER_ERROR_MESSAGE = "服务器忙,请稍后再试";
@ExceptionHandler
public R handle(HttpServletRequest req, HandlerMethod method, Exception ex) {
if (ex instanceof BusinessException) {
BusinessException exception = (BusinessException) ex;
(("访问 %s -> %s 出现业务异常!", uestURI(), ng()), ex);
return (GENERIC_SERVER_ERROR_MESSAGE);
} else if (ex instanceof RuntimeException){


发布评论