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

Retrofit接口应选择什么返回类型?网络异常该如何处理?

Retrofit三种返回值区别&协程场景异常处理指南

三类返回值的核心区别

三类返回值适用于不同的开发场景,核心差异如下:

  • Call<List<Data>>:Retrofit原生的请求封装类型,不依赖协程能力。你可以选择调用execute()同步执行请求,或者调用enqueue()传入回调异步处理请求结果,本身不支持挂起,协程开发场景下除非有特殊封装需求,否则不推荐选择该返回类型。
  • List<Data>:Kotlin协程适配Retrofit后的简化返回类型,对应的接口方法必须添加suspend修饰符。该模式下Retrofit会自动执行请求、解析响应:仅当HTTP响应码为2xx成功区间时,才会直接返回解析后的List<Data>实体;所有非2xx响应、网络连接错误、数据解析错误都会直接抛出异常。
  • Response<List<Data>>:同样是协程场景下的挂起函数返回类型,也需要给接口方法加suspend修饰符。和直接返回实体的区别是:无论HTTP响应码是2xx/4xx/5xx,都不会主动抛出响应码相关的异常,你可以通过isSuccessful属性自行判断请求状态,再通过body()获取成功数据、errorBody()获取错误响应内容。该模式下仅底层网络错误、数据解析错误这类请求执行阶段的问题会抛出异常。

异常处理常见问题解答

  • 调用接口时仅用try catch包裹调用逻辑即可吗?
    协程场景下是的,只要接口方法是挂起函数(返回值为List<Data>或Response<List<Data>>),在协程作用域内用try catch包裹调用逻辑,就可以捕获所有抛出的异常。如果使用Call类型,只有同步调用execute()时可以用try catch捕获异常,异步调用enqueue()的异常只会在onFailure回调中返回,外层try catch无法捕获。
  • 三类返回类型都支持用try catch捕获异常吗?
    1. Call<List<Data>>:仅同步执行execute()时支持try catch捕获,异步enqueue()的异常只能在回调中处理。
    2. List<Data>:完全支持,所有请求失败场景(非2xx响应、网络错误、解析错误)都会抛出对应异常,可以被正常捕获。
    3. Response<List<Data>>:支持,但仅会抛出网络错误、解析错误这类请求执行阶段的异常,4xx/5xx服务端响应不会抛出,需要自行判断响应码处理。
  • 返回List<Data>的场景下,发生异常时是否会正常抛出?
    会,只要请求未返回2xx成功响应、或出现网络连接失败、数据解析失败的情况,都会抛出对应异常,比如IOException(网络错误)、HttpException(非2xx响应)、JsonDataException(Moshi解析错误),都可以被try catch正常捕获。

内容的提问来源于stack exchange,提问作者SmallGrammer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:15:03