• 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/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格式或者跳转到指定的错误页面等.
    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开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

  • 相关阅读:
    统计SQL
    记一次惨痛教训
    window ssh 连接 本地虚拟机ubuntu 16
    js undefined 笔记
    java new java.text.SimpleDateFormat("yyyyMM01").format(date)
    java 反射
    mapinfo使用
    EnableAutoConfiguration注解说明
    Eureka Server 代码分析01
    BigDecimal 学习比较
  • 原文地址:https://www.cnblogs.com/javastack/p/16117235.html
Copyright © 2020-2023  润新知