乐趣区

关于java:Spring-Boot-异常处理值得学习

作者:xbhog\
链接:www.cnblogs.com/xbhog/p/15207278.html

异样解决:

背景:

最近在搭建属于本人的集体博客(码农小白的执念),本人搭建后端的时候首先思考的是异样解决。集体也是一边学习一边做,不免有疏漏的中央,心愿敌人们在不对的中央揭示下。

技术栈:

  1. springBoot 2.5.3
  2. Mybatis-plus
  3. thymeleaf
  4. mysql

该博客简略记录一下本人的学习过程,如果前面作出简略的 demo 来,那么会整顿其中的细节公布进去。

举荐一个 Spring Boot 基础教程及实战示例:
https://github.com/javastacks…

异样解决

集体毛糙的学习和了解,我把异样谬误分为三个,4xx,5xx,error(自定义)

罕用的是 404 和 500 响应

  • 404(未找到)服务器找不到申请的网页
  • 服务器外部谬误 服务器遇到谬误,无奈实现申请

在 templates 文件下创立 404.html、500.html 和 error.html

如果创立的是 4xx.html 和 5xx.html, 那么当页面找不到或者程序外部谬误的话,SpringBoot 主动匹配到这两个页面,具体的源码在这里就不剖析,感兴趣的能够去学习下。

当我想将错误信息返回到我自定义的页面怎么写?

咱们自顶向下来思考:

  1. 咱们拜访页面的时候,页面产生谬误也好,找不到也好,是不是都要走它申请的 Url,那咱们怎么解决这个申请呢?
  2. 这时候咱们自然而然的想到拦截器,所以编写 ControllerExceptionHandler 类,来专门拦挡所有的异样申请。
  3. 当咱们解决完异样后,把这个放逐行,或者返回咱们须要的自定义页面上。

这样就实现了咱们上述的需要。

所须要的技术点:

  1. @ControllerAdvice

    • 配合 @ExceptionHandler 注解联合应用, 当异样抛到 controller 层时, 能够对异样进行对立的解决, 规定返回的 json 格局或者跳转到指定的谬误页面等.
  2. @ExceptionHandler(Exception.class) // 示意 捕捉 全副异样
  3. ModelAndView 其实就是两个作用,一个是指定返回页面,另一个是在返回页面的同时增加属性

通过 Logger 来打印获取相干的异样信息:

// 获取异样的信息
logger.error(() -> {return String.format("Request URL : %s,Exception : %s", request.getRequestURL(),e);
},e);

在这里本人走了一些弯路,小伙子本人走窄了,导包倒错了😂。这里我导的包是 mybatis 中的:

import org.mybatis.logging.Logger;
import org.mybatis.logging.LoggerFactory;

传参始终不对,只能走源码的路子了,看看本人调用的什么玩意:最初就写成了上述的代码格局。

我看其他人写的代码的时候才恍然大明确,如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

logger.error("Requst URL : {},Exception : {}", request.getRequestURL(),e);

可能有的敌人感觉没啥,然而我本人调了半个小时才进去,菜是原罪。

Logger 这个只是在控制台输入,或者绑定了日志,会输入到日志中。

接着上述问题通过 ModelAndView 类实现:

ModelAndView 像极了 Model。

ModelAndView modelAndView = new ModelAndView();  // 实例化一个 ModelAndView
modelAndView.addObject("url",request.getRequestURL());  // 获取的 url 增加到 model 中
modelAndView.addObject("exception",e);  // 获取的异样信息
// 返回给 error 页面
modelAndView.setViewName("error/error");
return modelAndView;

敲黑板:来新需要了!

如果我想从所有的异样中剥离出 404 异样并返回给 SpringBoot 让他主动解决页面怎么解。

依照学习的来说。当页面为 null 的时候,向上抛出一个自定义的异样类,该异样类标注了异样状态。

throw new NotFoundException("博客找不到,请分割管理员"); // 自定义类
@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException{public NotFoundException() {super();
    }
    public NotFoundException(String message) {super(message);
    }
}

而后咱们能够在总的异样中通过 AnnotationUtils.findAnnotation 通过传入 AnnotatedElement注解类型 来查找办法或者类对象上的注解。

如果满足条件能够抛出异样让 SpringBoot 接管。

if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {throw e;}

完结:

如果你看到这里或者正好对你有所帮忙,心愿能点个关注或者举荐,感激!

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿(2022 最新版)

2. 劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4. 别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版