我一直在阅读有关使用协程处理异常的信息,但是我还不清楚一些事情。
fun invoke(params: Params, onResult: (UseCaseResponse<Type>)?) {
CoroutineScope(Dispatchers.Main).launch {
try {
val result = run(params)
onResult?.onSuccess(result)
Log.d(TAG, "Response: $result")
} catch (e: CancellationException) {
Log.d(TAG, "Error: $e")
onResult?.onError(apiErrorHandler.traceErrorException(e))
} catch (e: Exception) {
Log.d(TAG, "Error: $e cause: ${e.cause}")
onResult?.onError(apiErrorHandler.traceErrorException(e))
}
}
}
最佳答案
这听起来像是一个愚蠢的答案,但是当有人扔出它时,就会发生CancellationException
。
基本上,是的,当协程(或其父协程)被取消(是,通过job.cancel()
)时,应该引发此异常。但是,由工程师负责,编写挂起函数以检查其是否已取消并是否按规定行事(例如,像CancellationException
中的所有挂起函数一样,将kotlinx.coroutines
抛出)。因此,您的代码是否捕获CancellationException
取决于run(params)
内部发生的情况。
有关更多信息和代码示例,请参见Cancellation is cooperative和Making computation code cancellable。