如何忽略 JobCancellationException?

How to ignore JobCancellationException?

最近,我将 Kotlin Coroutines 从实验版升级到 1.1.1,但遇到了 job.cancel() 在新版本中工作方式不同的问题。

下面是实验协程的代码:

fun <R : Any, T : Deferred<R>> T.runAsync(
        job: Job,
        onSuccess: (result: R) -> Unit,
        onFailed: (errorMsg: String?) -> Unit) {
    launch(UI, parent = job) {
        try {
            val result = this@runAsync.await()
            onSuccess(result)
        } catch (e: Exception) {
            onFailed(e.message)
        }
    }
}

这是 1.1.1:

fun <R : Any, T : Deferred<R>> T.runAsync(
        job: Job,
        onSuccess: (result: R) -> Unit,
        onFailed: (errorMsg: String?) -> Unit) {
    GlobalScope.launch(Dispatchers.Main + job) {
        try {
            val result = withContext(Dispatchers.IO) {
                this@runAsync.await()
            }
            onSuccess(result)
        } catch (e: Exception) {
            onFailed(e.message)
        }
    }
}

例如:

我的片段在协程期间被销毁并调用 job.cancel() 是 运行。

在实验性协程中,onSuccess()onFailed() 都不会被调用。

在 1.1.1 中:onFailed() 调用是因为 JobCancellationException

我想加上catch (e: JobCancellationException),但是不可能:

/**
 * @suppress **This an internal API and should not be used from general code.**
 */
internal expect class JobCancellationException(

所以,问题是:如何handle/ignore JobCancellationException ?

您尝试捕获超级 class CancellationException,它是 public API.

的一部分

请注意,如果某些东西抛出 CancellationException,您通常会重新抛出它,以便上游对象收到有关取消的通知。参见 Cancellation is Cooperative