堆栈跟踪在协程环境中不是很有用,这使得异常类型和消息非常重要.由第三方库引发的异常可能具有非常泛型的类型和消息,从而无法理解导致异常的代码在哪里.
将更多特定于上下文的消息附加到异常的常见方法是捕获并重新引发异常:
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就是一个很好的例子-堆栈跟踪非常通用,不包含任何用户创建的函数.