Manejo de errores de actualización

Envolví mi código de Retrofit en una clase como la siguiente. Si no está claro del código que estoy publicando, es interactuar con un servicio relajante con OAuth.

¿Cuál sería una buena manera de hacer el manejo de errores? El servidor REST devuelve un mensaje de error en formato json. Me gustaría actuar sobre ese mensaje lanzando algunas excepciones de mi clase. Estoy tratando de hacer algo como a continuación. ¿Pero es este buen diseño? Es la mezcla de callbacks y la excepción de tirar una buena idea? ¿Hay una mejor manera?

Con el siguiente enfoque podría obtener mensajes i18l desde dentro de mis excepciones personalizadas y brindar por el usuario.

public class RestClient implements IRestClient { private IRestAPI api; /** * * @param accessToken */ public RestClient(final String accessToken) { RequestInterceptor requestInterceptor = new RequestInterceptor() { @Override public void intercept(RequestFacade request) { request.addHeader("Authorization", "Bearer " + accessToken); } }; RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(Config.ENDPOINT) .setRequestInterceptor(requestInterceptor) .build(); api = restAdapter.create(IRestAPI.class); } @Override public void requestSomething(final Callback callback) { api.getSomething(new Callback<Something>() { @Override public void success(Something something, Response response) { callback.success(something, response); } @Override public void failure(RetrofitError error) { if(error.getMessage().getId().euqals(ACCESS_TOKEN_EXPIRED)) { throw new AccessTokenExpired(); } else if(error.getMessage().getId().euqals(USER_NOT_FOUND)) { throw new UsernamePasswordNotFound(); } else // something else happened... { throw error; } } }); } @Override public void deleteSomething(final Callback callback) { api.deleteSomething(new Callback<Something>() { @Override public void success(Something something, Response response) { callback.success(something, response); } @Override public void failure(RetrofitError error) { if(error.getMessage().getId().euqals(SOMETHING_NOT_FOUND)) { ... ... Different exceptions } ... } }); } } 

Naturalmente tendría que crear mi propia interfaz de devolución de llamada con sólo un método de éxito.

Al crear el RestAdapter , puede proporcionar un controlador de errores que mapea sus excepciones personalizadas, omite la llamada al failure en el Callback<T> en cualquier cosa 4xx / 5xx. Como un ejemplo realmente artificial:

 public class Scratch { public static void main(String[] args) { Endpoints e = new RestAdapter.Builder() .setEndpoint("http://google.com") .setLogLevel(RestAdapter.LogLevel.FULL) .setErrorHandler(new ErrorHandler() { @Override public Throwable handleError(RetrofitError cause) { switch (cause.getResponse().getStatus()) { case 400: /* Handle the expected body format */ cause.getBody(); throw new RuntimeException("Bad Request"); default: /* Things and stuff */ throw new RuntimeException(""); } } }) .build() .create(Endpoints.class); e.getGoogle(new Callback<Response>() { @Override public void success(Response response, Response response2) { System.out.println("Got it"); } @Override public void failure(RetrofitError error) { System.err.println("This won't ever be seen due to the error handler."); } }); } private static interface Endpoints { @GET("/foo/bar") void getGoogle(Callback<Response> callback); } } 

Edit : Al hacer esto, sin embargo, potencialmente está sacrificando una gran razón por la que desea utilizar la interfaz de Callback para empezar. Si se trata de un uso común que necesitará, puede tener más sentido utilizar las llamadas de sincronización y devolver el tipo de objeto. No entiendo su uso para decir que es necesario, pero parece que puede ser más apropiado.

  • El título de la barra de aplicaciones no se muestra en android 5.0 y superior
  • Perder los extras de Intent cuando regresa a Actividad
  • ListView: deshabilitar el clic / enfoque
  • 'Texture2D': No se encontró ninguna función sobrecargada equivalente OpenGL ES2 Android (JAVA)
  • Uso de OpenGL para reemplazar Canvas - Android
  • Cajón de navegación para múltiples actividades
  • Android - Cómo permitir sólo un cierto número de lugares decimales
  • Cómo almacenar elementos seleccionados de un ExpandableListView en un ArrayList
  • Android: trazado de dibujo como superposición en MapView
  • Encontrar puntos contenidos en una ruta de acceso en Android
  • ¿RestKit en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.