- 異常處理
- 通過(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)行捕獲。- 在協(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) }
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)