述
本文我们来了解一下 Spring Boot 的异常报告器,它是 Spring Boot 帮我们定位程序错误的一个工具,就是在程序运行错误的时候,在控制台打印出一个错误报告,方便我们排查问题,下面来看一下异常报告器是如何工作的
异常报告器解析
首先还是进入启动类的run方法看一下
SpringBootExceptionReporter
这里是定义了一个 SpringBootExceptionReporter
的集合,我们来看一下这个类
然后会通过 SpringFactoriesLoader
去加载他的实现,来看一下 spring.factories
中这个类有哪些实现
FailureAnalyzers
可以看到,这里只有一个实现类就是 FailureAnalyzers
,在 run 方法中的 getSpringFactoriesInstances()
方法,会创建对应实现类的实例,也就是说会进入 FailureAnalyzers
的构造,我们来看一下
在上面的构造中,调用了 loadFailureAnalyzers()
和 prepareFailureAnalyzers()
这两个方法,分别看一下
loadFailureAnalyzers()
prepareFailureAnalyzers()
其实就是做了一件事,找到所有的 FailureAnalyzer
的实现类,然后把实现类需要的属性赋值上去,我们再来看一下 FailureAnalyzer
有哪些实现类
FailureAnalyzer
先是一个抽象的实现 AbstractFailureAnalyzer
然后下面是具体的子类实现,这个类做的事情也简单,只有一个 analyze()
方法,传入一个错误之后,返回 FailureAnalysis
对象,然后我们进入 FailureAnalysis
看看他有哪些属性
他其实就是对错误的一些描述
SpringBootExceptionReporter实现类的处理
返回来再来看一下 SpringBootExceptionReporter
的实现类 FailureAnalyzers
实现的 reportException()
这个方法
看一下这两个方法具体做的事情
这里是先循环遍历所有的 FailureAnalyzer
,然后得到一个 FailureAnalysis
,再调用 report()
方法处理
analyze()
所以我们这里先关注一下 analyze()
这个方法,看一下 FailureAnalysis
这个对象是怎么返回来的,先进入他的抽象实现 AbstractFailureAnalyzer.analyze()
这里调用了 findCause()
和 analyze()
, findCause()
中又调用了 getCauseType()
,看一下这几个方法做的事情
findCause()
这个方法主要是找到子类关心的错误,做一下转换, findCause()
方法中,参数是一个 Throwable
对象,那他里面为什么要循环一下, 这里主要是防止类似 throw new AException(new BException(new CException("cause")))
这种错误
analyze()
至于 analyze()
方法
这里只是一个抽象的实现,具体会交给子类去处理
返回来看 report()
方法中, 用到了 FailureAnalysisReporter
这个类的实现,这个类的实现在 spring 中也只有一个,就是 LoggingFailureAnalysisReporter
如下
看到上面这个文本格式,应该都不陌生了,都见过
总结
以上,就是 Spring Boot 的异常报告器的工作原理,回过头来画画图
框架内实现流程:
reportException()
处理流程:
analyze()
处理流程图: