Kotlin 如何通过ServiceLoader注册CoroutineExceptionHandler?

Kotlin 如何通过ServiceLoader注册CoroutineExceptionHandler?,kotlin,exception,kotlin-coroutines,Kotlin,Exception,Kotlin Coroutines,Kdoc表示: 默认情况下,如果未安装处理程序,则会出现未捕获异常 按以下方式处理: 如果异常为CancellationException,则忽略它(因为 是取消正在运行的协同程序的假定机制) 否则: 如果上下文中有作业,则调用Job.cancel 否则,将通过找到CoroutineExceptionHandler的所有实例 ServiceLoader和当前线程的thread.uncaughtExceptionHandler是 调用 关于“通过ServiceLoader找到的CoroutineE

Kdoc表示:

默认情况下,如果未安装处理程序,则会出现未捕获异常 按以下方式处理:

如果异常为CancellationException,则忽略它(因为 是取消正在运行的协同程序的假定机制)

否则:

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

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

关于“通过ServiceLoader找到的CoroutineExceptionHandler的所有实例”(Kotlin文档只触及冰山一角的情况并不少见),没有提供任何详细信息。如何做到这一点


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

OP here,根据@amamin的评论和文章得出结论

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

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


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

如果他们指的是serviceloader,那么试着在项目资源中放一个名为
kotlinx.coroutines.CoroutineExceptionHandler
,并附加一行,其中包含处理程序类的全名(例如:
my.project.MyHandler
)。如果你的处理程序有一个默认构造函数(没有参数),这就足够了。@amanin你很接近了,但是建议的路径是错误的。看看我的答案。