如何忽略JobCancellationException?

问题描述 投票:0回答:1

最近,我将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 = [email protected]()
            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) {
                [email protected]()
            }
            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(

所以,问题是:如何处理/忽略JobCancellationException

android kotlin kotlinx.coroutines
1个回答
5
投票

你尝试捕获超类CancellationException,这是公共API的一部分。

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

© www.soinside.com 2019 - 2024. All rights reserved.