Kotlin中通过Retrofit拦截器处理TimeOutException的方法咨询
完全可以参考NoInternetException的实现逻辑,通过自定义OkHttp拦截器统一处理超时异常,实现方案如下:
1. 定义自定义超时异常类
和你现有的NoInternetException保持一致,继承IOException即可:
class RequestTimeoutException : IOException() { override val message: String get() = "请求超时,请稍后重试" }
2. 实现超时捕获拦截器
在拦截器中用try-catch包裹请求执行逻辑,捕获到超时异常时统一抛出自定义异常:
class TimeoutInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { return try { chain.proceed(chain.request()) } catch (e: SocketTimeoutException) { // 捕获所有超时类异常,统一抛出我们自定义的异常 throw RequestTimeoutException() } } }
3. 注册拦截器
在创建Retrofit实例时,把这个拦截器加入拦截器列表即可:
Api = createAPI( Api::class.java, BuildConfig.REST_URL, NoConnectionInterceptor(App.INSTANCE), TimeoutInterceptor() // 添加超时拦截器 )
注意事项
- 上述代码捕获的
SocketTimeoutException已经覆盖连接超时、读取超时、写入超时三类场景,如果你需要区分不同超时类型给出不同提示,可以分别捕获细分异常类做对应处理 - 自定义异常统一继承
IOException,可以直接适配Retrofit的原有回调逻辑,异常会自动进入onFailure分支,不需要额外做类型适配 - 如果你用协程调用Retrofit挂起接口,这个自定义异常也可以被正常捕获,和普通异常处理逻辑一致
内容的提问来源于stack exchange,提问作者Oluwafemi
相关产品推荐
相关产品推荐

