【问题标题】:OkHttp callback eats up exceptions - design flaw or common practiceOkHttp 回调吞噬异常 - 设计缺陷或常见做法
【发布时间】:2015-11-19 14:28:58
【问题描述】:

OkHttp库Callback接口声明为

public interface Callback {
  void onFailure(Request request, IOException e);
  void onResponse(Response response) throws IOException;
}

onResponse 方法中未处理的异常将被 Call 类吃掉,正如我最近在 Callback failure for cancelled call in OkHttp 中发现的那样

我有几个与该设计相关的问题。


首先,为了强制在onResponse 中捕获异常而不是抛出它们,最好有不同的onResponse 方法声明,因为它们会被吃掉。

这是OkHttp Callback接口中的设计缺陷还是Java中这种代码的常见做法?


其次,当http请求到达onResponse回调方法时,我希望此时应该禁止取消请求。我会说这是一个错误。我说的对吗?

【问题讨论】:

  • 我刚刚发现了这一点,我很生气。花了几个小时调试,后来发现该方法抛出异常。这不是 Java 的东西,只是一个糟糕的 API。

标签: java android exception-handling okhttp


【解决方案1】:

我也在为此苦苦挣扎,目前我已解决如下:

 client.newCall(request).enqueue(new Callback() {

            @Override
            public void onFailure(Call call, final IOException e) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // AlertDialog, etc.
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
            if (!response.isSuccessful()) {
                onFailure(call, new IOException("Unexpected code: " + response));
            }

                // else success

            }
        });

关键是在 OnResponse 内部调用 OnFailure。我无法以任何其他方式访问异常(尽管可能还有其他方式;在我看来,这给了 OnFailure 一些额外的用处,并且我认为它很好地传达了意图)。注意 OnFailure 可以因为其他原因被调用:https://square.github.io/okhttp/2.x/okhttp/com/squareup/okhttp/Callback.html

【讨论】:

  • 但是我怎样才能抛出与 IOException 类型不同的地方呢?
猜你喜欢
  • 2011-02-05
  • 1970-01-01
  • 2016-04-23
  • 2020-08-27
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
相关资源
最近更新 更多