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

  • 什么时候会出现CancellationException?我是否必须将协程分配给作业,然后调用job.cancel()使其发生?
  • 查看我的代码,它会被捕获吗?还是第一个捕获块没有用?
  •     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))
                }
            }
        }
    

    最佳答案

    这听起来像是一个愚蠢的答案,但是当有人扔出它时,就会发生CancellationException
    基本上,是的,当协程(或其父协程)被取消(是,通过job.cancel())时,应该引发此异常。但是,由工程师负责,编写挂起函数以检查其是否已取消并是否按规定行事(例如,像CancellationException中的所有挂起函数一样,将kotlinx.coroutines抛出)。因此,您的代码是否捕获CancellationException取决于run(params)内部发生的情况。
    有关更多信息和代码示例,请参见Cancellation is cooperativeMaking computation code cancellable

    10-08 03:34