Spring Boot 异常处理,值得学习!

开发 后端
最近在搭建属于自己的个人博客(码农小白的执念),自己搭建后端的时候首先考虑的是异常处理。

背景:

个人也是一边学习一边做,难免有疏漏的地方,希望朋友们在不对的地方提醒下。

技术栈:

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

该博客简单记录一下自己的学习过程,如果后面作出简单的demo来,那么会整理其中的细节发布出来。

推荐一个 Spring Boot 基础教程及实战示例:

​https://github.com/javastacks/spring-boot-best-practice ​

异常处理

个人粗糙的学习和理解,我把异常错误分为三个,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格式或者跳转到指定的错误页面等.
  1. @ExceptionHandler(Exception.class) // 表示 捕获 全部异常
  2. ModelAndView 其实就是两个作用,一个是指定返回页面,另一个是在返回页面的同时添加属性

通过Logger来打印获取相关的异常信息:

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

在这里自己走了一些弯路,小伙子自己走窄了,导包倒错了😂。最新面试题整理好了,大家可以在Java面试库小程序在线刷题。

这里我导的包是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。

   ”

敲黑板:来新需求了!

如果我想从所有的异常中剥离出404异常并返回给SpringBoot让他自动处理页面怎么解。最新 Spring Boot 面试题整理好了,大家可以在Java面试库小程序在线刷题。

按照学习的来说。当页面为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;
}


责任编辑:庞桂玉 来源: Java技术栈
相关推荐

2021-04-20 10:50:38

Spring Boot代码Java

2022-10-26 07:14:25

Spring 6Spring业务

2021-04-30 07:34:01

Spring BootController项目

2023-09-24 13:55:42

Spring应用程序

2011-05-24 09:22:44

Spring3异常处理

2023-07-10 08:00:13

架构Rest返回值

2020-03-16 17:20:02

异常处理Spring Boot

2023-09-13 08:56:51

2020-06-08 09:15:14

前端 开发 Git

2022-04-27 08:55:01

Spring外部化配置

2011-01-21 11:12:01

Spring

2023-09-19 22:41:30

控制器HTTP

2017-07-31 15:47:50

Zuul统一处理

2017-05-19 15:13:05

过滤器Spring ClouZuul

2017-05-18 14:14:25

过滤器Spring ClouZuul

2023-12-11 14:19:00

Java程序异常

2023-11-30 07:00:56

SpringBoot处理器

2012-12-21 10:48:20

Java异常

2013-08-22 17:10:09

.Net异常处理

2023-02-23 08:15:33

Spring异常处理机制
点赞
收藏

51CTO技术栈公众号