SpringBoot 异常报告器解析

介绍

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

异常报告流程解析

SpringBoot 异常报告器解析_第1张图片

框架内实现

SpringBoot 异常报告器解析_第2张图片

reportException实现

SpringBoot 异常报告器解析_第3张图片

FailureAnalyzer介绍

SpringBoot 异常报告器解析_第4张图片

analyze逻辑

SpringBoot 异常报告器解析_第5张图片

FailureAnalysisReporter介绍

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

异常处理流程解析

SpringBoot 异常报告器解析_第6张图片

处理入口

异常处理入口handleRunFailure()方法

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

handleRunFailure逻辑

SpringBoot 异常报告器解析_第7张图片

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异常报告器?

你可能感兴趣的:(SpringBoot源码解析,java,spring,boot,开发语言)