如何解决如何通过ServiceLoader注册CoroutineExceptionHandler?
CoroutineExceptionHandler Kdoc说:
默认情况下,当未安装任何处理程序时,未捕获的异常是 处理方式如下:
如果异常是CancellationException,则将其忽略(因为 是取消正在运行的协程的机制)
否则:
如果上下文中有一个Job,则调用Job.cancel;
否则,通过以下方式找到CoroutineExceptionHandler的所有实例 ServiceLoader和当前线程的Thread.uncaughtExceptionHandler是 调用。
未提供有关“ 通过ServiceLoader找到的所有CoroutineExceptionHandler的所有实例”的详细信息(对于Kotlin文档,仅碰触冰山一角并不罕见)。怎么办?
我了解Thread.uncaughtExceptionHandler
;这不是这里的问题。
解决方法
在这里,OP是根据@amamin的评论和文章Creating Extensible Applications With the Java Platform来解决的。
要注册您的提供商,您必须创建一个提供商配置 JAR文件的META-INF / services目录中的文件。配置 文件名应为服务的标准二进制名称 类型。二进制名称只是其中的全限定类名称 名称的每个组成部分都由分隔。角色,以及 嵌套的类用$字符分隔。
例如,如果您实施 com.example.dictionary.spi.Dictionary服务类型,您应该创建 META-INF / services / com.example.dictionary.spi.Dictionary文件。上 在文件中的各行中,列出完全限定的二进制名称 具体的实现方式。
回到我的问题,我需要用一行(即实现的FQN)创建一个META-INF/services/kotlinx.coroutines.CoroutineExceptionHandler
文件。