Java中如何处理超时异常?

Java中如何处理超时异常?,java,timeout,Java,Timeout,这是我的密码: private void synCampaign() { List<Campaign> campaigns; try { campaigns = AdwordsCampaign.getAllCampaign(); for(Campaign c : campaigns) CampaignDao.save(c); } catch (ApiException e) { try

这是我的密码:

 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();
    }

}
private void syncamp(){
列出运动;
试一试{
活动=AdwordsCampaign.getAllCampaign();
对于(活动c:活动)
3.save(c);
}捕获(APIE){
试一试{
睡眠(5000);
}捕捉(中断异常e1){
e1.printStackTrace();
}
synCampaign();
e、 printStackTrace();
}捕获(远程异常){
试一试{
睡眠(5000);
}捕捉(中断异常e1){
e1.printStackTrace();
}
synCampaign();
e、 printStackTrace();
}
}
AdwordsCampaign.getAllCampaign()
尝试获取一些远程资源。由于internet连接超时,这可能引发
RemoteException
。当捕获到异常时,我只希望线程休眠一段时间,然后再次尝试获取远程资源


我的代码有问题吗?或者有更好的方法吗?

除了在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();
    }
private void syncamp(){
列出运动;
试一试{
活动=AdwordsCampaign.getAllCampaign();
对于(活动c:活动)
3.save(c);
}捕获(APIE){
e、 printStackTrace();
waitAndSync();
}捕获(远程异常){
e、 printStackTrace();
waitAndSync();
}
}
私有void waitAndSync(){
试一试{
睡眠(5000);
}捕捉(中断异常e1){
e1.printStackTrace();
}
synCampaign();
}

没有什么真正的错误,但是(可能是无限的)递归重试循环(以及堆栈增长)让我有点紧张。我会写:

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);
}
private void synCampaignWithRetries(int ntries,int msecsRetry){
而(ntries-->=0){
试一试{
synCampaign();
return;//无异常?成功
} 
捕获(APIE){
//日志异常?
}
捕获(远程异常){
//日志异常?
}
试一试{
睡眠(msecsRetry);
}捕捉(中断异常e1){
//日志异常?
}
}
//没有成功,即使使用ntries-log?
}
private void synCampaign()引发ApiException、RemoteException{
列出活动=AdwordsCampaign.getAllCampaign();
对于(活动c:活动)
3.save(c);
}

您确实无法将其作为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
        }

你的代码有效吗?或者你只是问你这样做是否合适?我只是觉得我的代码有点奇怪,所以我想确定我这样做是否合适@ClarkTo要解决infgoax提到的问题,我需要一个作业调度程序类@约根德拉·辛格