- 异常处理
- 通过封装的方式,对网络请求和结果处理,使用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
Kotlin的异常处理
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- kotlin协程的异常处理 在上一篇《Android kotlin协程入门(二):kotlin协程的关键知识点初步...
- 关键词:Kotlin 协程 异常处理 异步代码的异常处理通常都比较让人头疼,而协程则再一次展现了它的威力。 1. ...