我有以下代码:
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,我认为不是那么干净..有什么建议吗?
谢谢你!答案 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}},并将异常抛出一个级别。抛出异常优先于返回void
或true
,因为它们可以更全面地了解出现的问题。
最后,如果可能的话,最好抛出/捕获特定的false
类型(例如Exception
),因为异常会让调用者更好地了解发生的事情。