如何忽略 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
最近,我将 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