JobCancellationException

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 = [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

最佳答案

您尝试改为捕获父类(super class)CancellationException,这是公共(public)API的一部分。

请注意,如果有东西抛出CancellationException,通常应将其重新抛出,以便通知上游对象有关取消的信息。参见Cancellation is Cooperative

08-18 16:51