捕获GoogleJsonResponseException但e.getDetails()返回null

时间:2014-08-30 23:41:16

标签: java exception-handling google-drive-api

我有一个非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,因此在检查错误代码时会出现空指针异常。

根据http://javadoc.google-api-java-client.googlecode.com/hg/1.6.0-beta/com/google/api/client/googleapis/json/GoogleJsonResponseException.html#getDetails()

的google文档

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?

1 个答案:

答案 0 :(得分:2)

我会将此作为答案发布,以便那些处于相同位置的人,即使它没有解决您提出的具体问题。

一些建议

  1. 如果您要上传超过30个文件,则会遇到流量控制问题。 Drive的流量控制被打破,所以你应该自愿节流而不是成为受害者。请参阅403 rate limit on insert sometimes succeeds403 rate limit after only 1 insert per second

  2. 启用http日志记录(有关howto的信息,请参阅Java httpcliebnt的code.google.com页面)。这至少可以让你看到响应是什么,并可能提供一些关于如何最好地捕获异常的线索。

  3. 您链接的页面适用于1.6版。该库目前为1.19,因此请检查您是否使用了最新的lib和最新文档

  4. 令人困惑的是,有三个独立的库。

    1. 堆栈的底部是http库。 https://code.google.com/p/google-http-java-client/
    2. 上面是一般的api库。 https://code.google.com/p/google-api-java-client/和oauth图书馆https://code.google.com/p/google-oauth-java-client/
    3. 顶部的
    4. 是使用新API基础结构的各种Google服务的库。所以,例如。云端硬盘库位于https://developers.google.com/api-client-library/java/apis/drive/v2