使用FailureAnalyzer捕捉Spring Boot启动时出现的异常
经过
嗯,如果指定的端口已经在使用中引发异常的话,
原本Spring Boot就已经为此做好了准备,只是
可以覆盖也可以追加,就是说这个话题。
环境
春季引导2.2.2.RELEASE – 2.2.4.RELEASE
科特林1.3.61
格勒德
以上網頁內容所述的環境
Spring Boot 提供的 FailureAnalyzer。
为了捕获异常,需要继承AbstractFailureAnalyzer类。通过搜索得到的类是这个类。
可能有更多的,总共17个,还有可能会继承每个类。
当端口已经被占用时,将调用PortInUseException异常,而PortInUseFailureAnalyzer用于捕获此异常。
class PortInUseFailureAnalyzer extends AbstractFailureAnalyzer<PortInUseException> {
@Override
protected FailureAnalysis analyze(Throwable rootFailure, PortInUseException cause) {
return new FailureAnalysis("Web server failed to start. Port " + cause.getPort() + " was already in use.",
"Identify and stop the process that's listening on port " + cause.getPort() + " or configure this "
+ "application to listen on another port.",
cause);
}
}
班级的情况就像这样。
当您使用Boot Run启动应用程序时,…
这种感觉
在FailureAnalyzer中,日志中记录了描述(Description)和操作(Action)信息。
将Spring Boot提供的FailureAnalyzer替换为自定义的实现。
我不能真诚地推荐。
class MyPortInUseExceptionFailureAnalyzer : AbstractFailureAnalyzer<PortInUseException>() {
override fun analyze(rootFailure: Throwable, cause: PortInUseException): FailureAnalysis {
return FailureAnalysis(
cause.message,
"Port already in use!!!",
cause
)
}
}
创建一个继承AbstractFailureAnalyzer的类。
在resources/META-INF/文件夹下创建spring.factories文件。
org.springframework.boot.diagnostics.FailureAnalyzer =\
com.example.spring.boot.web.failure.analyzer.MyPortInUseFailureAnalyzer
其中的内容是这样的
用这个就可以注册OK
如果您在後台使用8080端口並運行Boot Run
我已经可以覆盖写入了。
不建议的话,因为可以更改异常时输出的信息,所以当实际发生异常时就不知道发生了什么。
在不改变输出内容的情况下添加处理可能是一个好选择吗…?
可能性 :
作为自定义故障分析器的用途,以下选项可能更实用。
使用FailureAnalyzer来捕获自定义的异常
/**
* 独自の例外
*/
class SampleException(message: String?) : RuntimeException(message)
/**
* カスタムFailureAnalyzerのサンプル
* アプリ起動中に発生したSampleExceptionをつかむ
*/
class SampleFailureAnalyzer : AbstractFailureAnalyzer<SampleException>() {
override fun analyze(rootFailure: Throwable, cause: SampleException): FailureAnalysis {
return FailureAnalysis(
cause.message,
"Sample Exception!",
cause
)
}
}
我們可以創建一個獨特的例外,並製作一個能夠捕獲這個例外的FailureAnalyzer。
spring.factories的内容大致如下
org.springframework.boot.diagnostics.FailureAnalyzer =\
com.example.spring.boot.web.failure.analyzer.MyPortInUseFailureAnalyzer ,\
com.example.spring.boot.web.failure.analyzer.SampleFailureAnalyzer
您也可以注册多个FailureAnalyzer。
所以,我想确认一下我创建的SampleFailureAnalyzer是否正常工作。所以我会随意准备以下内容。
/**
* アプリ起動中に読み込まれるサンプルComponent
*/
@Component
class SampleComponent {
fun run() {
throw SampleException("exception!")
}
}
/**
* リフレッシュ時にイベント発火するListenerクラス
*/
@Component
class SampleApplicationListener : ApplicationListener<ContextRefreshedEvent?> {
@Autowired
private val sampleComponent: SampleComponent? = null
/**
* リフレッシュ時にSampleComponentのrunを実行する(例外を発生させる)
*/
override fun onApplicationEvent(event: ContextRefreshedEvent) {
sampleComponent!!.run()
}
}
-
- 在刷新时会调用SampleApplicationListener的onApplicationEvent方法
-
- 调用sampleComponent的run方法
- 在run方法中发生异常
就是这种感觉
现在应用程序启动时会发生错误了
当我尝试执行时
我可以正常发送信息!
如果没有注册spring.factories,则会显示堆栈跟踪。
总结
-
- FailureAnalyzerでアプリ起動中の例外もつかめる!
-
- 既にSpring Bootが用意してくれてるものも上書きできる!
- 自分で作った例外もつかめる!
在某些情况下,堆栈跟踪可能更易于理解,不能一概而论地说捕获所有异常都是好的吧…… 不过,我们可以判断是否理解了异常以及是否可能发生异常,这还是挺方便的,我觉得。