首页 > 解决方案 > 如何通过 ServiceLoader 注册 CoroutineExceptionHandler?

问题描述

CoroutineExceptionHandler Kdoc说:

默认情况下,未安装处理程序时,未捕获的异常按以下方式处理:

如果异常是 CancellationException 那么它被忽略(因为这是取消正在运行的协程的假定机制)

否则:

如果上下文中有 Job,则调用 Job.cancel;

否则,调用通过 ServiceLoader 和当前线程的 Thread.uncaughtExceptionHandler 找到的所有 CoroutineExceptionHandler 实例。

没有提供有关“通过 ServiceLoader 找到的所有 CoroutineExceptionHandler 实例”的详细信息(Kotlin 文档仅触及冰山一角并不罕见)。这将如何完成?

我知道Thread.uncaughtExceptionHandler;这不是这里的问题。

标签: kotlinexceptionkotlin-coroutines

解决方案


OP 在这里,根据@amamin 的评论和文章使用 Java 平台创建可扩展应用程序找到了答案。

要注册您的提供程序,您必须在 JAR 文件的 META-INF/services 目录中创建一个提供程序配置文件。配置文件名应该是服务类型的完全限定二进制名。二进制名称只是完全限定的类名,其中名称的每个组成部分由 . 字符,嵌套类由 $ 字符分隔。

例如,如果你实现了 com.example.dictionary.spi.Dictionary 服务类型,你应该创建一个 META-INF/services/com.example.dictionary.spi.Dictionary 文件。在文件中的单独行上,列出具体实现的完全限定二进制名称。

回到我的问题,我需要META-INF/services/kotlinx.coroutines.CoroutineExceptionHandler用一行创建一个文件,即实现的 FQN。


推荐阅读