处理以下异常的有效方法

时间:2011-09-08 21:05:58

标签: java

我有以下代码:

public boolean perform(CronJob job)
   final Date lastQueryDateTime = new Date();
   QueryMode queryMode = job.getQueryModeEnum();
   try {
      if (queryMode.getCode().equals("FULL")) 
      {
         calculateCoverage();    

      } else if (queryMode.getCode().equals("INCREMENTAL")) 
      {
          calculateCoverage();
      }        
       job.setLastQueryDate(lastQueryDateTime);
       job.save(job);

       return true;

      } catch (Exception e) {
       LOG.error("Error while calculating the coverage for products.", e);
       return false;
      }
}

private void calculateCoverage()
{

// Some Logic

}

我怀疑是否实际上有太多的逻辑要处理,如果try / catch范围很广。有没有更好的方法来做到这一点?我会在calculateCoverage中处理try / catch,但在这种情况下,我需要将job作为一个argurment传递给calculateCoverage,我认为不是那么干净..有什么建议吗?

谢谢你!

3 个答案:

答案 0 :(得分:1)

看起来这是一个Quartz作业(或类似的东西),它不应该允许抛出异常。

因此,不是期望特定方法抛出特定类型的异常(在这种情况下,您希望将范围缩小到该方法调用)。相反,您希望确保如果此方法中的任何内容出错,您将不会将您的Cron作业置于错误状态。

由于在这种情况下try/catch的唯一目的是记录任何抛出的异常,并且您不打算以任何特殊方式处理它们,我认为将该块包含在内是完全合理的。该方法的全部内容。

但要注意整体逻辑。目前计算覆盖率的例外情况将导致作业无法再次运行。如果您希望作业稍后运行,即使它现在失败,您可能希望在那里有一个try / finally块。

try {
    final Date lastQueryDateTime = new Date();
    QueryMode queryMode = job.getQueryModeEnum();
    String code = queryMode.getCode();
    try{
        if (code.equals("FULL") || code.equals("INCREMENTAL")) 
        {
            calculateCoverage();
        }   
    } finally {
        job.setLastQueryDate(lastQueryDateTime);
        job.save(job);
    }
    return true;
} catch (Exception e) {
    LOG.error("Error while calculating the coverage for products.", e);
    return false;
}

这仍然会导致方法中的任何异常被捕获并记录,但如果在计算覆盖率时发生错误,您仍会尝试将作业设置为再次运行。

答案 1 :(得分:1)

虽然您的代码完全正常,但为了更好的可读性,您可以按如下方式编写代码:

public boolean perform(CronJob job)
   final Date lastQueryDateTime = new Date();
   QueryMode queryMode = job.getQueryModeEnum();
   if (queryMode.getCode().equals("FULL") || queryMode.getCode().equals("INCREMENTAL")) 
   {
         try {
              calculateCoverage();    
         } catch (Exception e) {
            LOG.error("Error while calculating the coverage for products.", e);
           return false;
         }        

   }        
   job.setLastQueryDate(lastQueryDateTime);
   job.save(job);
   return true;
}

private void calculateCoverage() throws Exception
{

// Some Logic

}

答案 2 :(得分:1)

我建议您在calculateCoverage()方法之外保留异常处理。尝试强制设计没有意义,以便您可以在包装器代码中“隐藏”异常,这是毫无意义的。

事实上,看看你的perform()方法在失败时返回false而在成功时返回true,我实际上建议只将perform()的返回类型更改为{{ 1}},并将异常抛出一个级别。抛出异常优先于返回voidtrue,因为它们可以更全面地了解出现的问题。

最后,如果可能的话,最好抛出/捕获特定的false类型(例如Exception),因为异常会让调用者更好地了解发生的事情。