Kotlin的异常处理
- 异常处理
- 通过封装的方式,对网络请求和结果处理,使用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则是对结果处理可能出现的异常进行捕获。
- 在协程方法中对于传入的上下文参数
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)
本文标题:Kotlin的异常处理
本文链接:https://www.haomeiwen.com/subject/sjrchrtx.html
网友评论