Kotlin的异常处理
2022-01-16 本文已影响0人
Infinity_空
- 异常处理
- 通过封装的方式,对网络请求和结果处理,使用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