Kotlin的異常處理

  1. 異常處理
    1. 通過(guò)封裝的方式,對(duì)網(wǎng)絡(luò)請(qǐng)求和結(jié)果處理,使用runCatching + try/catch進(jìn)行包裹
        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的一個(gè)頂層函數(shù),可以對(duì)其中的lamba表達(dá)式進(jìn)行try/catch,這里在上面的方法中是為了對(duì)網(wǎng)絡(luò)請(qǐng)求返回的一些異常值進(jìn)行捕獲。
    onSuccess中的try/catch則是對(duì)結(jié)果處理可能出現(xiàn)的異常進(jìn)行捕獲。
    1. 在協(xié)程方法中對(duì)于傳入的上下文參數(shù)CoroutineContext,可以傳入CoroutineExceptionHandler這個(gè)上下文來(lái)捕獲協(xié)程中的異常。
      例:
      viewModelScope.launch(CoroutineExceptionHandler { _, e -> onError(e) }) {
          block.invoke(this)
      }
      
      withContext(CoroutineExceptionHandler { _, e -> onError(e) }) {
          block.invoke(this)
      }
      
    但是這個(gè)CoroutineExceptionHandler只是為了在協(xié)程運(yùn)行中作為最后的防線,防止程序拋出異常導(dǎo)致crash,并不能對(duì)異常進(jìn)行處理和恢復(fù)。也僅有當(dāng)協(xié)程中拋出沒(méi)有處理的異常,才會(huì)被這個(gè)上下文所捕獲。并且,當(dāng)異常被這個(gè)上下文捕獲時(shí),意味著整個(gè)協(xié)程已經(jīng)被異常終止了。
    另外,這個(gè)CoroutineExceptionHandler只能作為最頂層的協(xié)程的上下文,并不能作為子協(xié)程的上下文。作用域是全局,有點(diǎn)類似于GlobalScope

參考:
Android協(xié)程(Coroutines)系列-Exception異常處理 - 掘金 (juejin.cn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容