使用 `invokeOnCompletion` 和 `try-catch` 的区别

std*_*out 5 exception kotlin kotlin-coroutines

正如标题所暗示的那样,我很好奇这样做之间是否有任何区别;

fun main() {
  val job = GlobalScope.launch(Dispatchers.Main) {
      withTimeout(2000L) {
        delayMe()
      }
  }
  job.invokeOnCompletion { cause -> println("We were canceled due to $cause") }
}

suspend fun delayMe() {
  withContext(Dispatchers.Default) {
    delay(5000L)
  }
}
Run Code Online (Sandbox Code Playgroud)

或这个;

fun main() {
  GlobalScope.launch(Dispatchers.Main) {
    try {
      withTimeout(2000L) {
        delayMe()
      }
    } catch(cause: Exception){
        println("We were canceled due to $cause")
    }
  }
  ...
}

...
Run Code Online (Sandbox Code Playgroud)

在处理协程内的异常方面。

PS:上面的示例代码灵感来自这里