package org.wikipedia.dataclient.retrofit; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.io.IOException; import retrofit2.Response; /** * This is RetrofitError converted to Retrofit 2 */ public class RetrofitException extends RuntimeException { public static RetrofitException httpError(Response<?> response) { return httpError(response.raw().request().url().toString(), response); } public static RetrofitException httpError(String url, Response<?> response) { String message = response.code() + " " + response.message(); return new RetrofitException(message, url, response.code(), Kind.HTTP, null); } public static RetrofitException httpError(@NonNull okhttp3.Response response) { String message = response.code() + " " + response.message(); return new RetrofitException(message, response.request().url().toString(), response.code(), Kind.HTTP, null); } public static RetrofitException networkError(IOException exception) { return new RetrofitException(exception.getMessage(), null, null, Kind.NETWORK, exception); } public static RetrofitException unexpectedError(Throwable exception) { return new RetrofitException(exception.getMessage(), null, null, Kind.UNEXPECTED, exception); } /** Identifies the event kind which triggered a {@link RetrofitException}. */ public enum Kind { /** An {@link IOException} occurred while communicating to the server. */ NETWORK, /** A non-200 HTTP status code was received from the server. */ HTTP, /** * An internal error occurred while attempting to execute a request. It is best practice to * re-throw this exception so your application crashes. */ UNEXPECTED } private final String url; @Nullable private final Integer code; private final Kind kind; RetrofitException(String message, String url, @Nullable Integer code, Kind kind, Throwable exception) { super(message, exception); this.url = url; this.code = code; this.kind = kind; } /** The request URL which produced the error. */ public String getUrl() { return url; } /** HTTP status code. */ @Nullable public Integer getCode() { return code; } /** The event kind which triggered this error. */ public Kind getKind() { return kind; } }