我正在使用以下代码向Web服务器发出HTTP GET请求:
private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception {
Request request = new Request.Builder()
.url("http://publicobject.com/helloworld.txt")
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
Headers responseHeaders = response.headers();
for (int i = 0; i < responseHeaders.size(); i++) {
System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
}
System.out.println(response.body().string());
}
根据OkHttp document,如下所示,如果由于取消,连接问题或超时而无法执行请求,okhttp3执行调用将抛出IOException。
抛出: IOException - 如果由于取消,连接问题或超时而无法执行请求。由于网络在交换过程中可能会失败,因此远程服务器可能会在失败之前接受请求。
我想知道是否有办法知道IOException是否是由于请求超时而导致的?
答案 0 :(得分:1)
虽然我在okHttp3文档中找不到有关超时异常的任何信息,但查看测试here表示在超时的情况下会引发SocketTimeoutException异常。
所以,为了回答我自己的问题,我们可以先捕获SocketTimeoutException,以便知道IOException是否是由于请求超时而导致的,如下所示:
try {
// make http request
} catch (SocketTimeoutException e) {
// request timed out
} catch (IOException e) {
// some other error
}