我有一个非Android Java应用程序,一个接一个地上传数千个文件。
对于每个插入,我正在实现指数退避:
Random randomGenerator = new Random();
for(int i = 0; i < 5; i++) {
try {
return service.files().insert(body, mediaContent).execute();
} catch(GoogleJsonResponseException e) {
if (e.getDetails().getCode() == 500
|| e.getDetails().getCode() == 501
|| e.getDetails().getCode() == 502
|| e.getDetails().getCode() == 503
|| e.getDetails().getCode() == 504
|| e.getDetails().getCode() == 403) {
Thread.sleep((1 << i) * 1000
+ randomGenerator.nextInt(1001));
} else {
// error besides 5xx
throw e;
}
} catch (HttpResponseException e) {
if (e.getStatusCode() == 500 || e.getStatusCode() == 501
|| e.getStatusCode() == 502 || e.getStatusCode() == 503
|| e.getStatusCode() == 504
|| e.getStatusCode() == 403) {
Thread.sleep((1 << i) * 1000
+ randomGenerator.nextInt(1001));
} else {
// error besides 5xx
throw e;
}
} catch (SocketTimeoutException e) {
Thread.sleep((1 << i) * 1000 + randomGenerator.nextInt(1001));
}
以下是问题:
我的应用程序多次捕获到GoogleJsonResponseException,但e.getDetails()返回null
,因此在检查错误代码时会出现空指针异常。
Returns the Google JSON error details or null for none (for example if response is not JSON).
基本上,我正在捕捉GoogleJsonResponseException
,但没有JSON。
为什么在世界上没有任何与之相关的Json时,我能抓住GoogleJsonResponseException
?为什么不抓住HttpResponseException
呢?
我希望我的应用程序能够捕获/使用Json,如果它已经返回,但是当GoogleJsonResponseException
甚至不能保证返回Json时我不知道如何可靠地执行此操作。
有什么建议吗?
我应该只使用HttpResponseException
来可靠地检查statusCode,然后查看getMessage()
以查看是否有JSON?
或者我应该只使用GoogleJsonResponseException
,而是调用它的父HttpResponseException
方法getStatusCode()
来查看状态代码,如果我真的,则只调用getDetails()
想检查/潜入任何可能的Json?
答案 0 :(得分:2)
我会将此作为答案发布,以便那些处于相同位置的人,即使它没有解决您提出的具体问题。
一些建议
如果您要上传超过30个文件,则会遇到流量控制问题。 Drive的流量控制被打破,所以你应该自愿节流而不是成为受害者。请参阅403 rate limit on insert sometimes succeeds和403 rate limit after only 1 insert per second
启用http日志记录(有关howto的信息,请参阅Java httpcliebnt的code.google.com页面)。这至少可以让你看到响应是什么,并可能提供一些关于如何最好地捕获异常的线索。
您链接的页面适用于1.6版。该库目前为1.19,因此请检查您是否使用了最新的lib和最新文档
令人困惑的是,有三个独立的库。