1

これが私のコードです:

 private void synCampaign() {
    List<Campaign> campaigns;
    try {
        campaigns = AdwordsCampaign.getAllCampaign();
        for(Campaign c : campaigns) 
            CampaignDao.save(c);
    } catch (ApiException e) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        synCampaign();
        e.printStackTrace();
    } catch (RemoteException e) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        synCampaign();
        e.printStackTrace();
    }

}

AdwordsCampaign.getAllCampaign()リモートリソースを取得しようとします。RemoteExceptionこれは、インターネット接続がタイムアウトしたために をスローする場合があります。例外がキャッチされたら、スレッドをしばらくスリープさせてから、リモート リソースを再度取得しようとします。

私のコードに問題はありますか? それとももっと良い方法がありますか?

4

3 に答える 3

2

特に問題はありませんが、(潜在的に無限の) 再帰を伴う再試行ループ (およびスタックの増加) には、少し神経質になります。代わりに次のように書きます。

private void synCampaignWithRetries(int ntries, int msecsRetry) {
    while(ntries-- >=0 ) {
       try {
         synCampaign();
         return; // no exception? success
       } 
      catch (ApiException e ) {
           // log exception?
      }
      catch (RemoteException e ) {
           // log exception?
      }
      try {
           Thread.sleep(msecsRetry);
      } catch (InterruptedException e1) {
           // log exception?
      }
   }
   // no success , even with ntries - log?
}

private void synCampaign() throws ApiException ,RemoteException {
    List<Campaign> campaigns = AdwordsCampaign.getAllCampaign();
    for(Campaign c : campaigns) 
            CampaignDao.save(c);
}
于 2012-11-20T03:14:38.343 に答える
1

これは、catch ブロック内のコードの繰り返しを除いて問題ないように見えます (必要な再試行回数を確認してください)。以下のように、例外を処理するプライベート メソッドを作成することができます。

    private void synCampaign() {
        List<Campaign> campaigns;
        try {
            campaigns = AdwordsCampaign.getAllCampaign();
            for(Campaign c : campaigns) 
                CampaignDao.save(c);
        } catch (ApiException e) {
            e.printStackTrace();
            waitAndSync();
        } catch (RemoteException e) {
            e.printStackTrace();
            waitAndSync();
        }

    }

    private void waitAndSync(){
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        synCampaign();
    }
于 2012-11-20T03:05:58.643 に答える
0

実際、それを SocketTimeoutException としてキャッチすることはできません。可能なことは、RemoteException をキャッチし、その原因を取得して、それが SocketTimeoutException のインスタンスであるかどうかを確認することです。

    try{
             // Your code that throws SocketTimeoutException

        }catch (RemoteException e) {
          if(e.getCause().getClass().equals(SocketTimeoutException.class)){
             System.out.println("It is SocketTimeoutException");
             // Do handling for socket exception
            }else{
              throw e;
            }
        }catch (Exception e) {
           // Handling other exception. If necessary
        }
于 2015-06-08T12:42:26.090 に答える