用Kotlin的方式来处理网络异常

简介: 用Kotlin的方式来处理网络异常

一. 前言



之前的文章 RxJava处理业务异常的几种方式 曾经介绍过 Retrofit 的异常可以有多种处理方式。


其中,可以使用 RxJava 的错误处理操作符,它们是专门用来处理异常的。


随便例举两个操作符:


onErrorReturn 操作符,表示当发生错误的时候,发射一个默认值然后结束数据流。所以 Subscriber 看不到异常信息,看到的是正常的数据流结束状态。

onErrorResumeNext 操作符,表示当错误发生的时候,使用另外一个数据流继续发射数据。在返回的被观察者中是看不到错误信息的。


二. 使用 Kotlin 的特性



这次我结合 Kotlin 扩展函数的特性来尝试处理异常。


网络请求返回的 Response 大多是采用如下这种形式:

{
   "code":0,
   "message":"success",
   "data":{
       ...
    }
}


对于客户端开发而言,我们会封装一个基类的HttpResponse。

data class HttpResponse<T>(
        var code: Int = -1, //0: 成功 1: xxx错误或过期 2: 业务逻辑错误 500:系统内部错误 998表示Token无效
        var message: String? = null,
        var data: T? = null
) : UnProguard {
    val isOkStatus: Boolean
        get() = code == 0
}


其中,UnProguard是一个空的接口,主要是方便 App 在混淆的时候保留部分类。

interface UnProguard : Serializable


通常情况下,我们会在 Observer 的 onError 中按照如下的方式处理异常:

viewModel.getHelps(this)
                .subscribe({
                    if (it.isOkStatus) {
                        multi_status_view.showContent()
                        adapter.addData(it.data?.list)
                    } else {
                        multi_status_view.showError()
                    }
                }, { multi_status_view.showError() })


如果我们利用 RxJava 的错误处理操作符,可以编写如下的扩展函数:

import com.safframework.utils.RetryWithDelay
import io.reactivex.Maybe
/**
 *
 * @FileName:
 *          cn.magicwindow.core.ext.`Maybe+Extension`.kt
 * @author: Tony Shen
 * @date: 2018-07-19 17:31
 * @version V1.0 <描述当前版本功能>
 */
/**
 * 尝试重试
 * 默认有3次重试机会,每次的延迟时间是1000ms
 */
fun <T> Maybe<T>.retryWithDelayMillis(maxRetries: Int=3, retryDelayMillis: Int=1000): Maybe<T> =
        this.retryWhen(RetryWithDelay(maxRetries,retryDelayMillis))
/**
 * 遇到错误时,能够提前捕获异常,并发射一个默认的值。
 * 后面无须再做异常处理
 */
fun <T> Maybe<T>.errorReturn(defValue:T): Maybe<T> = this.onErrorReturn {
    it -> it.printStackTrace()
    return@onErrorReturn defValue
}
fun <T> Maybe<T>.errorReturn(defValue:T,action: (Throwable) -> Unit): Maybe<T> = this.onErrorReturn {
    action.invoke(it)
    return@onErrorReturn defValue
}
/**
 * 遇到错误时,能够提前捕获异常,并返回一个新的Maybe
 * 后面无须再做异常处理
 */
fun <T> Maybe<T>.errorResumeNext(defValue:T):Maybe<T> = this.onErrorResumeNext(Maybe.just(defValue))
fun <T> Maybe<T>.errorResumeNext():Maybe<T> = this.onErrorResumeNext(Maybe.empty())


扩展函数 errorReturn 的使用:

viewModel.getHelps(this)
                .errorReturn(HttpResponse()) {
                    multi_status_view.showError()
                }
                .subscribe{
                    if (it.isOkStatus) {
                        multi_status_view.showContent()
                        adapter.addData(it.data?.list)
                    } else {
                        multi_status_view.showError()
                    }
                }


这样无须在 onError 中处理异常,而且 errorReturn 还是一个高阶函数。它的 action 参数传递的是一个函数,专门用于处理异常。每一个网络请求的异常处理并不会都一样,可以用该函数来传递不同的异常处理。


总结



合理利用 Kotlin 的扩展函数,可以编写优雅的代码。而使用高阶函数,则可以达到的进一步的抽象。

相关文章
|
5月前
|
数据采集 监控 安全
快速部署:基于Kotlin的公司网络流量控制方案
本文介绍了使用Kotlin构建网络流量控制系统的方案,该系统包括数据采集、分析和自动提交到网站的功能。`TrafficMonitor`类负责监控网络流量,收集流量数据并进行分析,然后通过HTTP POST请求将数据安全提交到指定网站,以实现对公司网络流量的有效管理和安全优化。此方案有助于提升网络安全性和性能,支持数字化业务发展。
144 5
|
5月前
|
网络协议 网络安全 Python
Python网络编程基础(Socket编程) 错误处理和异常
【4月更文挑战第10天】网络编程涉及到很多复杂的操作和潜在的风险,如连接失败、数据丢失、超时等问题。因此,正确的错误处理和异常捕获是确保网络程序稳定性和可靠性的关键。本章将介绍网络编程中常见的错误和异常,并探讨如何在Python中进行有效的错误处理。
|
5月前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
3月前
|
缓存 数据安全/隐私保护 Kotlin
Kotlin 中的网络请求代理设置最佳实践
Kotlin 中的网络请求代理设置最佳实践
|
1天前
|
Kotlin
Kotlin9- 参数与异常
Kotlin9- 参数与异常
12 3
|
1天前
|
Kotlin
Kotlin - 参数与异常
Kotlin - 参数与异常
|
8天前
|
Kotlin
Kotlin教程笔记(9)- 参数与异常
Kotlin教程笔记(9)- 参数与异常
38 3
|
1月前
|
设计模式 开发者 UED
深入理解Kotlin中的异步网络请求处理
深入理解Kotlin中的异步网络请求处理
|
5月前
|
数据采集 缓存 Java
代理服务器调试技巧:优化Kotlin网络爬虫的数据抓取过程
代理服务器调试技巧:优化Kotlin网络爬虫的数据抓取过程
|
2月前
|
机器学习/深度学习 运维 监控

热门文章

最新文章