堆栈跟踪在协程环境中不是很有用,这使得异常类型和消息非常重要.由第三方库引发的异常可能具有非常泛型的类型和消息,从而无法理解导致异常的代码在哪里.

将更多特定于上下文的消息附加到异常的常见方法是捕获并重新引发异常:

try { ... } catch (e: Exception) { throw RuntimeException("unique message", e) }

这是协程中众所周知的反模式,因为特殊的异常类型CancellationException不能被意外吞噬.

这就留下了一个问题,以下是应该被认为是反模式的,还是完全没有问题?

try {
   ...
} catch (e: CancellationException) {
   throw e
} catch (e: Exception) {
   throw RuntimeException("unique message", e)
}

[1]io.grpc.StatusException使用Kotlin协程GRPC客户端API就是一个很好的例子-堆栈跟踪非常通用,不包含任何用户创建的函数.

推荐答案

这就是我在代码中所做的,我从来没有看到任何停止的理由.作为Java中的先例,异常转换的必要性得到了权威来源(如Efficient Java)的广泛认可和推荐.

有一个特定的例子是相关的:假设您的方法没有声明判断过的异常,但您调用了一些有判断过的异常的API.您希望包装这样的异常,但不希望不加判断地包装未选中的异常.你最终会写出几乎和你在这里展示的一样的习语.

Kotlin相关问答推荐

Fleet无法从构建文件自动重新加载更改错误'

如果启用了Flyway迁移,则不能具有配置属性';datources.default.架构-生成

jOOQ Kotlin Coroutines - Select all and exists查询

访问者闭包中的Kotlin序列yield 率

创建包含 3 个相同项目的列表/使用返回类型重复

使用调度程序运行异步 Kotlin 代码

Kotlin 如何使用其 get 函数在内部检索映射值

Kotlin - 协程未按预期执行

验证构造函数中的值组合

Kotlinwhen表达式在使用主题时是否支持复合布尔表达式?

无法创建类 ViewModel kotlin 的实例

在 Kotlin 中取最后 n 个元素

验证和 DDD - kotlin 数据类

Kotlin如何分派invoke操作符?

将ExpectedException与Kotlin一起使用

使用主构造函数时使用Kotlin getter/setter

接口中的属性不能有支持字段

使用 Moshi/Retrofit2 访问深度嵌套的 JSON 数组

从另一个列表创建一个列表

java.lang.NoClassDefFoundError:解析失败:Lkotlin/time/MonoClock