Подтвердить что ты не робот

Лучший способ отладки сообщений об ошибках дооснащения

Я новичок в Retrofit. Я использовал Volley, и я вроде как Retrofit. Я как раз собирался выбрать Retrofit, когда я столкнулся с этим сообщением без описательного при попытке выполнить POST.

 Exception in thread "main" retrofit.RetrofitError
    at retrofit.RetrofitError.httpError(RetrofitError.java:37)
    at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:413)
    at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:282)
    at myapi.api.$Proxy7.logon(Unknown Source)
    at myapi.api.TestDriver.main(TestDriver.java:94)

Ну, я должен сказать, что этот тип сообщения об ошибке примерно так же полезен, как теплый куртка в Сахаре.

Кто-нибудь знает, с чего начать с отладки этого типа сообщения? Я действительно не собираюсь делегировать REST api, который не предоставляет полезные сообщения об ошибках.

4b9b3361

Ответ 1

Вероятно, вы хотите добавить предложение catch к TestDriver.main:

try {
  service.logon();
} catch (RetrofitError e) {
  System.out.println(e.getResponse().getStatus());
}

Ответ 2

Создайте пользовательский ErrorHandler для дооснащения.

Я обнаружил, что улавливание ошибки не предоставило много дополнительной информации, но создание настраиваемого ErrorHandler для Retrofit позволило мне углубиться в фактическую ошибку, например:

class MyErrorHandler implements ErrorHandler {
  @Override public Throwable handleError(RetrofitError cause) {
    Response r = cause.getResponse();
    if (r != null && r.getStatus() == 401) {
      return new UnauthorizedException(cause);
    }
    return cause;
  }
}

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .setErrorHandler(new MyErrorHandler())
    .setLogLevel(RestAdapter.LogLevel.FULL)  // Do this for development too.
    .build();

В разделе Пользовательская обработка синхронной обработки ошибок на Страница "Обновление" .

Установите уровень журнала FULL, как показано в приведенном выше коде конфигурации.

Ответ 3

К сожалению RetrofitError (1.6.1) был сложным. 401 сделал getResponse() всегда возвращает значение null, из-за чего ему трудно определить, связана ли его проблема с подключением или проблема с проверкой подлинности. По крайней мере, для меня мне пришлось посмотреть сообщение, чтобы получить ошибку 401. Надеюсь, это поможет кому-то еще попытаться сделать что-то подобное.

public class RetrofitErrorHandler implements ErrorHandler {

    @Override
    public Throwable handleError(RetrofitError cause) {

        if (cause.isNetworkError()) {
            if(cause.getMessage().contains("authentication")){
                //401 errors
                return  new Exception("Invalid credentials. Please verify login info.");
            }else if (cause.getCause() instanceof SocketTimeoutException) {
                //Socket Timeout
                return new SocketTimeoutException("Connection Timeout. " +
                        "Please verify your internet connection.");
            } else {
                //No Connection
                return new ConnectException("No Connection. " +
                        "Please verify your internet connection.");
            }
        } else {

            return cause;
        }
    }

}