kotlin - 如何通过 ServiceLoader 注册 CoroutineExceptionHandler?
问题描述
CoroutineExceptionHandler Kdoc说:
默认情况下,未安装处理程序时,未捕获的异常按以下方式处理:
如果异常是 CancellationException 那么它被忽略(因为这是取消正在运行的协程的假定机制)
否则:
如果上下文中有 Job,则调用 Job.cancel;
否则,调用通过 ServiceLoader 和当前线程的 Thread.uncaughtExceptionHandler 找到的所有 CoroutineExceptionHandler 实例。
没有提供有关“通过 ServiceLoader 找到的所有 CoroutineExceptionHandler 实例”的详细信息(Kotlin 文档仅触及冰山一角并不罕见)。这将如何完成?
我知道Thread.uncaughtExceptionHandler
;这不是这里的问题。
解决方案
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。
推荐阅读
- ruby-on-rails - 为什么我的 webpack-html-loader 不加载我的 html 文件?
- regex - 在 .htacces 中使用正则表达式进行重定向
- google-chrome - 如何在我的 EC2 虚拟计算机上永久禁用 chrome 更新?
- regex - 删除字符串空间并使用 RegEx 进行比较
- java - 如何将 JSP 包含到具有 servlet 映射以更改 URL 的其他 JSP 中?
- php - 从数组中仅获取一个值
- c++11 - 问题是我需要输入字符串来接受空行
- angular - Angular使对象数组成为我在json中的数据
- python - 如何将数据从烧瓶连续传递到html文件?
- postgresql - PostgreSQL 的 SSIS 连接管理器错误“值不在预期范围内”