Retrofit: unable to handle exception caused by retrofit/okhttp

Created on 29 Dec 2014  ·  5Comments  ·  Source: square/retrofit

as you can see the error is originated by a call not from my application (com.wow) so there is no way i can handle such exception. is there any way i could handle this?

12-29 09:25:41.681  16296-16863/com.wow D/Retrofit﹕ ---- ERROR http://app.abserver.com/api/device_login
12-29 09:25:41.691  16296-16863/com.wow D/Retrofit﹕ java.net.UnknownHostException: Unable to resolve host "app.abserver.com": No address associated with hostname
            at java.net.InetAddress.lookupHostByName(InetAddress.java:434)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:239)
            at java.net.InetAddress.getAllByName(InetAddress.java:214)
            at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
            at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197)
            at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.java:68)
            at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:37)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)
            at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
            at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
            at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at retrofit.Platform$Android$2$1.run(Platform.java:142)
            at java.lang.Thread.run(Thread.java:864)
     Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
            at libcore.io.Posix.getaddrinfo(Native Method)
            at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:415)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:239)
            at java.net.InetAddress.getAllByName(InetAddress.java:214)
            at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
            at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197)
            at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.java:68)
            at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:37)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)
            at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
            at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
            at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at retrofit.Platform$Android$2$1.run(Platform.java:142)
            at java.lang.Thread.run(Thread.java:864)

Most helpful comment

in the case of my example, the exception did not return to the failure() method which caused a crash of the application

All 5 comments

UnknownHostException is an IOException which means you can handle it in both the synchronous and asynchronous case by checking if the RetrofitError's getKind() == Kind.NETWORK.

Or using instanceof checks on RetrofitError's getCause().

in the case of my example, the exception did not return to the failure() method which caused a crash of the application

This code correctly calls the failure callback:

public final class Test {
  interface Service {
    @GET("/") void thing(Callback<String> cb);
  }

  public static void main(String... args) throws IOException, InterruptedException {
    RestAdapter ra = new RestAdapter.Builder()
        .setEndpoint("http://app.abserver.com")
        .build();
    Service service = ra.create(Service.class);
    service.thing(new Callback<String>() {
      @Override public void success(String s, Response response) {
        System.out.println("SUCCESS!");
      }

      @Override public void failure(RetrofitError error) {
        error.printStackTrace();
      }
    });
    Thread.sleep(1000);
  }
}

When executing a request synchronously (i.e. without the callback parameter), the exception doesn't appear to be rethrown inside a RetrofitError.

Any suggestions for cases where the request is already in a background thread? My particular case sees a synchronous request inside an AsyncTaskLoader using Retrofit 1.9.0.

Was this page helpful?
0 / 5 - 0 ratings