使用FailureAnalyzer捕捉Spring Boot启动时出现的异常

经过

嗯,如果指定的端口已经在使用中引发异常的话,
原本Spring Boot就已经为此做好了准备,只是

可以覆盖也可以追加,就是说这个话题。

环境

春季引导2.2.2.RELEASE – 2.2.4.RELEASE
科特林1.3.61
格勒德

以上網頁內容所述的環境

Spring Boot 提供的 FailureAnalyzer。

为了捕获异常,需要继承AbstractFailureAnalyzer类。通过搜索得到的类是这个类。

image.png

可能有更多的,总共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);
    }

}

班级的情况就像这样。

image.png

当您使用Boot Run启动应用程序时,…

image.png

这种感觉

在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

image.png

我已经可以覆盖写入了。

不建议的话,因为可以更改异常时输出的信息,所以当实际发生异常时就不知道发生了什么。
在不改变输出内容的情况下添加处理可能是一个好选择吗…?

可能性 :
作为自定义故障分析器的用途,以下选项可能更实用。

使用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()
    }

}

    1. 在刷新时会调用SampleApplicationListener的onApplicationEvent方法

 

    1. 调用sampleComponent的run方法

 

    在run方法中发生异常

就是这种感觉
现在应用程序启动时会发生错误了

当我尝试执行时

image.png

我可以正常发送信息!

如果没有注册spring.factories,则会显示堆栈跟踪。

image.png

总结

    • FailureAnalyzerでアプリ起動中の例外もつかめる!

 

    • 既にSpring Bootが用意してくれてるものも上書きできる!

 

    自分で作った例外もつかめる!

在某些情况下,堆栈跟踪可能更易于理解,不能一概而论地说捕获所有异常都是好的吧…… 不过,我们可以判断是否理解了异常以及是否可能发生异常,这还是挺方便的,我觉得。

广告
将在 10 秒后关闭
bannerAds