SpringBoot 异常报告器解析

介绍

SpringBootExceptionReporter用于捕获和处理启动期间的异常,例如应用程序上下文的初始化失败。我们业务中的异常处理一般使用拦截器进行拦截处理业务异常。

异常报告流程解析

框架内实现

reportException实现

FailureAnalyzer介绍

analyze逻辑

FailureAnalysisReporter介绍

  • 功能: 报告异常给到用户
  • 实现类: LoggingFailureAnalysisReport
  • 实现方法: 根据失败分析结果类构建错误信息输出

异常处理流程解析

处理入口

异常处理入口handleRunFailure()方法

try {
    ......
}
catch (Throwable ex) {
    handleRunFailure()
}

handleRunFailure逻辑

handleExitCode逻辑

  • exitcode退出状态码, 为0代表正常退出, 否则异常退出
  • 发布ExitCodeEvent事件
  • 记录exitcode

listener.failed逻辑

  • 发布ApplicationFailedEvent事件

reportFailure逻辑

  • SpringBootExceptionReporter实现调用reportException方法
  • 成功处理的话记录已处理异常

context.close逻辑

  • 更改应用上下文状态
  • 销毁单例bean
  • beanFactory置为空
  • 关闭web容器(web环境)
  • 移除shutdownHook

shutdownHook介绍

  • 作用jivm退出时执行的业务逻辑
  • 添加:Runtime.getRuntime().addShutdownHook
  • 移除:Runtime.getRuntime().removeShutdownHook

ReflectionUtils.rethrowRuntimeException逻辑

  • 重新抛出异常

实战

@Component
public class MyExitCodeExceptionMapper implements ExitCodeExceptionMapper {
    @Override
    public int getExitCode(Throwable exception) {
        if (exception instanceof ConnectorStartFailedException) {
            return 10;
        }
        return 0;
    }
}
public class MyExceptionReporter implements SpringBootExceptionReporter {

    private ConfigurableApplicationContext context;

    public MyExceptionReporter(ConfigurableApplicationContext context) {
        this.context = context;
    }

    @Override
    public boolean reportException(Throwable failure) {
        if (failure instanceof UnsatisfiedDependencyException) {
            UnsatisfiedDependencyException exception = (UnsatisfiedDependencyException) failure;
            System.out.println("no such bean " + exception.getInjectionPoint().getField().getName() );
        }
        return false;
    }
}

面试题

  • 关闭钩子方法的作用及使用方法?
  • 介绍下SpringBoot异常报告器类结构?
  • 介绍下SpringBoot昇常报告器的实现原理?
  • 讲述下SpringBoot异常处理流程?
  • SpringBoot异常处理流程中有哪些注意事项?
  • 如何自定义实现SpringBoot异常报告器?

相关推荐

  1. SpringBoot 源码

    2024-01-22 02:58:01       61 阅读
  2. springboot请求参数

    2024-01-22 02:58:01       32 阅读
  3. 2024年奥莱利科技趋势报告

    2024-01-22 02:58:01       40 阅读
  4. SpringBoot程序启动流程

    2024-01-22 02:58:01       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-22 02:58:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-22 02:58:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-22 02:58:01       87 阅读
  4. Python语言-面向对象

    2024-01-22 02:58:01       96 阅读

热门阅读

  1. GraphQL语法用于模式验证和代码生成的新方法

    2024-01-22 02:58:01       57 阅读
  2. 独孤思维:做副业,家人不理解怎么办?

    2024-01-22 02:58:01       51 阅读
  3. 开发安全之:System Information Leak: External

    2024-01-22 02:58:01       52 阅读
  4. 2024作息打卡和事件梳理

    2024-01-22 02:58:01       52 阅读
  5. iView 中DatePicker日期选择器 v-model不生效的情况

    2024-01-22 02:58:01       44 阅读
  6. 【鸿蒙4.0】harmonyos Day 04

    2024-01-22 02:58:01       54 阅读
  7. Spring MVC常用注解有哪些?都有什么用?

    2024-01-22 02:58:01       55 阅读
  8. Android学习(五):常用控件

    2024-01-22 02:58:01       61 阅读