Spring Boot-14-异常报告器

本文我们来了解一下 Spring Boot 的异常报告器,它是 Spring Boot 帮我们定位程序错误的一个工具,就是在程序运行错误的时候,在控制台打印出一个错误报告,方便我们排查问题,下面来看一下异常报告器是如何工作的

异常报告器解析

首先还是进入启动类的run方法看一下

image

SpringBootExceptionReporter

这里是定义了一个 SpringBootExceptionReporter 的集合,我们来看一下这个类

image

然后会通过 SpringFactoriesLoader 去加载他的实现,来看一下 spring.factories 中这个类有哪些实现

image

FailureAnalyzers

可以看到,这里只有一个实现类就是 FailureAnalyzers ,在 run 方法中的 getSpringFactoriesInstances() 方法,会创建对应实现类的实例,也就是说会进入 FailureAnalyzers 的构造,我们来看一下

image

在上面的构造中,调用了 loadFailureAnalyzers()prepareFailureAnalyzers() 这两个方法,分别看一下

loadFailureAnalyzers()

image

prepareFailureAnalyzers()

image

其实就是做了一件事,找到所有的 FailureAnalyzer 的实现类,然后把实现类需要的属性赋值上去,我们再来看一下 FailureAnalyzer 有哪些实现类

FailureAnalyzer

image

先是一个抽象的实现 AbstractFailureAnalyzer 然后下面是具体的子类实现,这个类做的事情也简单,只有一个 analyze() 方法,传入一个错误之后,返回 FailureAnalysis 对象,然后我们进入 FailureAnalysis 看看他有哪些属性

image

他其实就是对错误的一些描述

SpringBootExceptionReporter实现类的处理

返回来再来看一下 SpringBootExceptionReporter 的实现类 FailureAnalyzers 实现的 reportException() 这个方法

image

看一下这两个方法具体做的事情

image

这里是先循环遍历所有的 FailureAnalyzer ,然后得到一个 FailureAnalysis ,再调用 report() 方法处理

analyze()

所以我们这里先关注一下 analyze() 这个方法,看一下 FailureAnalysis 这个对象是怎么返回来的,先进入他的抽象实现 AbstractFailureAnalyzer.analyze()

image

这里调用了 findCause()analyze() , findCause() 中又调用了 getCauseType(),看一下这几个方法做的事情

findCause()

image

这个方法主要是找到子类关心的错误,做一下转换, findCause() 方法中,参数是一个 Throwable 对象,那他里面为什么要循环一下, 这里主要是防止类似 throw new AException(new BException(new CException("cause"))) 这种错误

analyze()

至于 analyze() 方法

image

这里只是一个抽象的实现,具体会交给子类去处理

返回来看 report() 方法中, 用到了 FailureAnalysisReporter 这个类的实现,这个类的实现在 spring 中也只有一个,就是 LoggingFailureAnalysisReporter 如下
image

看到上面这个文本格式,应该都不陌生了,都见过

总结

以上,就是 Spring Boot 的异常报告器的工作原理,回过头来画画图

框架内实现流程:

image

reportException() 处理流程:

image

analyze() 处理流程图:

image