Java 调试改装错误消息的最佳方法

Java 调试改装错误消息的最佳方法,java,android,debugging,rest,retrofit,Java,Android,Debugging,Rest,Retrofit,我是新来的。我用过截击,我有点喜欢改装。我正要选择改型,当我试图写一篇博文时,遇到了这条非描述性的错误消息 Exception in thread "main" retrofit.RetrofitError at retrofit.RetrofitError.httpError(RetrofitError.java:37) at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:413) at

我是新来的。我用过截击,我有点喜欢改装。我正要选择改型,当我试图写一篇博文时,遇到了这条非描述性的错误消息

 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。

您可能想向TestDriver添加catch子句。main:

try {
  service.logon();
} catch (RetrofitError e) {
  System.out.println(e.getResponse().getStatus());
}
为改装创建自定义的
ErrorHandler
。 我发现捕捉错误并不能提供大量额外信息,但是为改型创建一个自定义的
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();
从上的自定义同步错误处理部分


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

不幸的是,错误(1.6.1)很棘手。401的makegetresponse()总是返回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;
        }
    }

}

在堆栈跟踪的后面是否可能有一个“起因”?实际上没有。我只看到在命令行上运行Reformation。嘿,Jesse,你能看看Reformation吗?错误并不总是有一个getResponse,所以你必须检查null。注意:如果你用Reformation上传大文件,您必须关闭
日志级别
,否则,它将尝试处理日志中的整个文件,并将给您一个难以捉摸的
OutOfMemoryError
。使用改型1.6.1,401个错误没有给我响应。因此,我必须检查消息cause.getMessage()包含(“身份验证”),以检查它是否是401。改型1.9是否仍然存在相同的问题