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