18

我是Retrofit的新手。我用过 Volley,我有点喜欢 Retrofit。当我在尝试执行 POST时遇到这个非常非描述性的错误消息时,我正要选择 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。

4

3 回答 3

21

为 Retrofit创建一个自定义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();

来自Retrofit Page的自定义同步错误处理部分。

将日志级别也设置为FULL,如上面的配置代码所示。

于 2014-03-21T19:56:49.447 回答
20

您可能希望将 catch 子句添加到TestDriver.main

try {
  service.logon();
} catch (RetrofitError e) {
  System.out.println(e.getResponse().getStatus());
}
于 2014-01-12T18:57:23.857 回答
4

不幸的是 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;
        }
    }

}
于 2014-09-10T20:25:34.073 回答