2014-08-30 29 views
3

我有一個非Android Java應用程序一個接一個上傳數千個文件。捕獲GoogleJsonResponseException但e.getDetails()返回null

對於每個插入,我執行指數退避像這樣:

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,但ē .getDetails()返回null因此,當檢查錯誤代碼時,我得到空指針異常。

%的谷歌文檔在http://javadoc.google-api-java-client.googlecode.com/hg/1.6.0-beta/com/google/api/client/googleapis/json/GoogleJsonResponseException.html#getDetails()

Returns the Google JSON error details or null for none (for example if response is not JSON).

所以基本上,我趕上一個GoogleJsonResponseException但沒有JSON。

爲什麼在世界上我可以捕捉到GoogleJsonResponseException,但實際上並沒有任何Json與之關聯?爲什麼沒有它捕獲HttpResponseException

我希望我的應用程序能夠在返回時捕獲/使用Json,但我不知道如何確保GoogleJsonResponseException甚至不能保證返回Json。

有什麼建議嗎?

我應該只是用HttpResponseException來可靠地檢查statusCode,然後看看getMessage()看看是否有JSON?

或者我應該只使用GoogleJsonResponseException但調用它的父HttpResponseException方法getStatusCode()看到狀態代碼,只有getDetails(),如果我真的檢查/潛入任何可能的Json?

+0

該指數倒轉是使用驅動API V2客戶端LIB(1.19.0),並在https://developers.google.com/drive/web是基於谷歌關閉當前的Java代碼示例/處理錯誤 我認爲谷歌需要更新此頁面... – mmcrae 2014-09-02 14:25:57

+0

你真的需要捕捉一個403來處理流量控制,並且你需要跟蹤http來查看網絡上發生了什麼。我建議你將問題發佈到https://groups.google.com/forum/#!forum/google-http-java-client – pinoyyid 2015-01-29 04:49:24

+0

,正是我所檢查的狀態代碼是無關緊要的 - 問題集中在「 null'由'GoogleJsonResponseException.getDetails()'返回。感謝谷歌論壇鏈接...我會嘗試。 – mmcrae 2015-01-29 15:23:06

回答

2

我會將其作爲回答發佈,因此對於那些處於相同位置的人來說,儘管它沒有解決您提出的具體問題。

一些建議

  1. 如果您上傳超過30個文件,你會打的流量控制問題。 Drive的流量控制被打破,所以你應該自願油門而不是成爲受害者。請參閱403 rate limit on insert sometimes succeeds403 rate limit after only 1 insert per second

  2. 啓用http日誌記錄(請參閱code.google.com網頁中關於Java httpcliebnt的howto)。這至少可以讓你看到反應是什麼,並且可以提供一些關於如何最好地捕捉異常的線索。

  3. 您鏈接到的頁面版本爲1.6。據我所知庫是目前在1.19,以便檢查是否正在使用最新的lib和最新的文檔

什麼增加了混亂的是,有三個獨立的庫。

  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. 頂部是使用新API基礎結構的各種Google服務的庫。所以例如。驅動器庫是在https://developers.google.com/api-client-library/java/apis/drive/v2
+0

感謝您的回覆...... Java的API驅動API的文檔對我來說真的令人困惑。我無法弄清楚最有效的文檔在哪裏。 是在這裏:http://javadoc.google-api-java-client.googlecode.com/hg/1.6.0-beta/com/google/api/client/googleapis/json/GoogleJsonResponseException.html#getDetails( ) 或者在這裏:https://developers.google.com/resources/api-libraries/documentation/drive/v2/java/latest/ – mmcrae 2014-08-31 17:57:04

+0

似乎還有**很多**是不明確的或在Google Drive SDK/Apps中詳細記錄...感謝您提供所知的信息 – mmcrae 2015-02-03 20:58:53

相關問題