Kotlin的异常处理

2022-01-16  本文已影响0人  Infinity_空
  1. 异常处理
    1. 通过封装的方式,对网络请求和结果处理,使用runCatching + try/catch进行包裹
        runCatching {
            doRequest.invoke()
        }.onSuccess { result: Response<T> ->
            try {
                if (result.isSuccessful) {
                    successAction(result)
                } else {
                    failAction(result)
                }
            } catch (e: Exception) {
                Timber.tag("onSuccess").e(e)
            }
        }.onFailure { e ->
            Timber.tag("onFailure").d(e)
        }
    
    runCatching是Kotlin的一个顶层函数,可以对其中的lamba表达式进行try/catch,这里在上面的方法中是为了对网络请求返回的一些异常值进行捕获。
    onSuccess中的try/catch则是对结果处理可能出现的异常进行捕获。
    1. 在协程方法中对于传入的上下文参数CoroutineContext,可以传入CoroutineExceptionHandler这个上下文来捕获协程中的异常。
      例:
      viewModelScope.launch(CoroutineExceptionHandler { _, e -> onError(e) }) {
          block.invoke(this)
      }
      
      withContext(CoroutineExceptionHandler { _, e -> onError(e) }) {
          block.invoke(this)
      }
      
    但是这个CoroutineExceptionHandler只是为了在协程运行中作为最后的防线,防止程序抛出异常导致crash,并不能对异常进行处理和恢复。也仅有当协程中抛出没有处理的异常,才会被这个上下文所捕获。并且,当异常被这个上下文捕获时,意味着整个协程已经被异常终止了。
    另外,这个CoroutineExceptionHandler只能作为最顶层的协程的上下文,并不能作为子协程的上下文。作用域是全局,有点类似于GlobalScope

参考:
Android协程(Coroutines)系列-Exception异常处理 - 掘金 (juejin.cn)

上一篇 下一篇

猜你喜欢

热点阅读