我是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。
答案 0 :(得分:20)
您可能想要向TestDriver.main
添加一个catch子句:
try {
service.logon();
} catch (RetrofitError e) {
System.out.println(e.getResponse().getStatus());
}
答案 1 :(得分:20)
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 ,如上面的配置代码所示。
答案 2 :(得分: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;
}
}
}