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

use*_*731 18 java debugging rest android retrofit

我是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)
Run Code Online (Sandbox Code Playgroud)

好吧,我必须说这种类型的错误信息与撒哈拉沙漠中的一件温暖夹克一样有用.

有没有人知道从哪里开始调试这种类型的消息?我真的不想委托一个没有提供有用错误消息的REST api.

Jes*_*son 20

您可能想要将catch子句添加到TestDriver.main:

try {
  service.logon();
} catch (RetrofitError e) {
  System.out.println(e.getResponse().getStatus());
}
Run Code Online (Sandbox Code Playgroud)

  • RetrofitError并不总是有getResponse,所以你必须检查null. (5认同)

Jos*_*ter 20

ErrorHandler为Retrofit 创建自定义.

我发现捕获错误没有提供大量额外信息,但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();
Run Code Online (Sandbox Code Playgroud)

从" 改造页面"上的" 自定义同步错误处理"部分.

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

  • 注意:如果要使用Retrofit上传大文件,则必须关闭"日志级别",否则,它会尝试处理日志中的整个文件,并为您提供难以理解的"OutOfMemoryError". (2认同)