【问题标题】:When would the CancellationException happen?CancellationException 什么时候会发生?
【发布时间】:2020-10-08 11:46:39
【问题描述】:

我一直在阅读有关使用协程处理异常的文章,但我还不清楚一些事情。

  1. CancellationException 何时发生?我是否必须将协程分配给作业,然后调用 job.cancel() 才能发生?

  2. 看看我的代码,它会被抓住吗?还是第一个catch块没用?

    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))
            }
        }
    }

【问题讨论】:

    标签: kotlin kotlin-coroutines coroutine


    【解决方案1】:

    这听起来可能是一个愚蠢的答案,但CancellationException 会在有人扔它时发生。

    基本上,是的,这个异常应该在协程(或其父协程)被取消时抛出(是的,通过job.cancel())。但工程师有责任编写挂起函数来检查它是否被取消并尊重地行事(例如,抛出CancellationException,就像kotlinx.coroutines 中的所有挂起函数一样)。因此,您的代码是否捕获 CancellationException 取决于 run(params) 内部发生的情况。

    有关更多信息和代码示例,请参阅 Cancellation is cooperativeMaking computation code cancellable

    【讨论】:

    • 好的,所以在运行中我调用我的存储库:override suspend fun run(params: Params): BuffDomainModel { return repository.getBuff(params.id) } 这将使用改造 class BuffRepository { suspend fun getBuff(buffId: Long) = BuffApi.retrofitService.getBuff(buffId).result.toDomainModel() } interface BuffApiService { @GET("buffs/{buffId}") suspend fun getBuff(@Path("buffId") buffId: Long) : BuffResponse } 进行休息 api 调用所以回答我自己的问题,不,它不会因为我没有扔它所以被抓住了。我说的对吗?
    • 你说得对,好像Retrofit doesn't throw it
    • 还有一个关键原语suspendCancellableCoroutine,当您取消协程时,它以CancellationException 结尾。所以事实上你很少需要明确地检查isActive标志,但你必须注意不要使用suspendCoroutine,这是不可取消的。
    猜你喜欢
    • 2011-01-01
    • 2011-03-21
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多