在协程处理程序和try-catch块中处理异常

时间:2019-12-24 16:23:20

标签: kotlin kotlin-coroutines

如果我们有像这样的基本处理程序

protected val baseHandler = CoroutineExceptionHandler { _, e ->
        handleError(e)
}

并通过try-catch块执行代码

scope.launch(baseHandler){
  try{
      throw ...
     }
     catch(e:Exception) {
}

是否可以先在catch块中处理异常,然后在基本处理程序中作为后备处理? 此代码的目标是为所有项目协程提供一个基本的异常处理程序。

1 个答案:

答案 0 :(得分:2)

您创建并传递的CoroutineExceptionHandler将用于协程中未处理的异常。

例如,如果您想捕获一种特定类型的Exception,并处理CoroutineExceptionHandler中的所有其他异常,则可以try-catch仅使用该类型:

GlobalScope.launch(baseHandler) {
    try {
        throw IllegalStateException("oh no it failed")
    } catch (e: IllegalStateException) {
        // Handles the exception
    }
}

如果在IllegalStateException块中引发了try以外的异常,则该异常将传播到您的处理程序。

或者,您可以在catch分支中捕获内容,但是如果您在那里无法处理,则将它们重新抛出,而是将其交给处理程序处理:

GlobalScope.launch(baseHandler) {
    try {
        // Code that can throw exceptions
    } catch (e: Exception) {
        if (/* some condition */) {
            throw e
        }
    }
}