web-dev-qa-db-ja.com

レトロフィットエラーメッセージをデバッグする最良の方法

Retrofit は初めてです。私はボレーを使用したことがあり、レトロフィットが好きです。 POSTを実行しようとしたときにこのnon-descriptiveエラーメッセージが表示されたときに、Retrofitを選択しようとしていました。

 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に委任するつもりはありません。

18
user3186731

おそらく、TestDriver.mainにcatch句を追加する必要があります。

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

レトロフィット用のカスタムErrorHandlerを作成します。

エラーをキャッチしても多くの追加情報は得られないことがわかりましたが、RetrofitのカスタムErrorHandlerを作成すると、次のように実際のエラーをさらに詳しく調べることができます。

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();

Retrofit Pageカスタム同期エラー処理セクションから

上記の構成コードに示すように、ログレベルを[〜#〜] full [〜#〜]にも設定します。

20
Joshua Pinter

残念ながら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;
        }
    }

}
4
Kalel Wade