You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:42:02