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

Retrofit 2.3.0错误响应处理异常:errorBody方法失效后又恢复

搞定Retrofit 2.3.0错误信息显示不稳定的问题

兄弟,你遇到的这个问题我之前也踩过坑,结合你说的errorBody.toString()失效、errorBody.string()时好时坏的情况,咱们一步步捋清楚:

为啥会出现这种反复横跳的情况?

  • errorBody.toString()根本就没对过:这个方法返回的是OkHttp里ResponseBody对象的内存引用字符串(比如okhttp3.ResponseBody$1@abcd123),不是服务器返回的实际错误内容,之前你可能误以为它能拿到内容,其实从一开始就没起作用。
  • errorBody.string()的“时好时坏”是流的锅:OkHttp的ResponseBody是一次性的字节流,调用一次string()后,流就被读完关闭了。如果你的代码里有多次读取errorBody的操作(比如先打日志再弹Toast),第一次读能拿到内容,第二次就空了——这应该就是你上周失效、今天又正常的原因,今天的场景里你只读取了一次。

靠谱的解决办法:先缓存错误内容

要避免流被重复读取的问题,咱们先把错误体的内容一次性读出来存到变量里,再用这个变量做后续操作:

private static void showToastErrorMessage(Context context, Response<?> response) {
    if (response.errorBody() != null) {
        try {
            // 一次性读取错误体内容并缓存
            String errorJson = response.errorBody().string();
            // 这里可以根据你的服务器返回格式解析成实体类,比如用Gson
            // ErrorResponse errorResp = new Gson().fromJson(errorJson, ErrorResponse.class);
            // 然后显示具体的错误信息,比如 errorResp.getMsg()
            Toast.makeText(context, errorJson, Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(context, "抱歉,出现未知错误", Toast.LENGTH_SHORT).show();
        }
    } else {
        Toast.makeText(context, "请求失败,请稍后再试", Toast.LENGTH_SHORT).show();
    }
}

额外要注意的点

  • 如果需要同时记录日志和显示错误,一定要先把errorBody.string()的结果存到变量里,再用这个变量去打日志和弹Toast,绝对不能多次调用string()。
  • Retrofit 2.3.0确实有点老了,虽然这个流的问题新版本也存在,但新版本有peekBody()方法可以复制一份响应体,不用怕流被关闭。如果项目允许,建议升级到2.9.0以上的稳定版本,能省不少麻烦。
  • 结合你提供的服务器响应截图,记得把返回的JSON解析成对应的实体类,别直接显示整个JSON串,用户体验会好很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:00:44