更好地设计跨方法的常见错误处理

时间:2013-07-12 21:58:49

标签: java

我有几种方法可以执行相同类型的错误处理并希望重构它。我的类中的所有方法X都调用binding.X,其中binding是我的依赖类(第三方/ Salesforce soap API,因此我们无法控制抛出的异常类型)。 X可以是createupdatedeletequery。对于所有这些方法,我必须检查异常代码是否用于会话过期,然后再次登录并重试该方法。

public void create(SObject[] s){
try{
    binding.create(s);
 } catch (ApiFault e) {
    if(e.getExceptionCode == INVALID_SESSION_ID) {
               //login again
               login();
       //retry
       binding.create(s);
    }
 }
}

更新,删除后面是相同的模式。 Query方法接受不同的参数。

public void query(String query){
    try{
        binding.query(query);
    } catch (ApiFault e) {
        if(e.getExceptionCode == INVALID_SESSION_ID) {
            //login again
               login();
           //retry on specific code
           binding.query(query);
        }
    }
}

所以我在每个方法中都将重试的逻辑放在INVALID_SESSION_ID上。有没有更好的方法来设计这些方法?

1 个答案:

答案 0 :(得分:4)

您可以将每个操作都包含在策略中:

private void executeWithLogin(Runnable r) {
    try {
        r.run();
    } 
    catch (Exception e) {
        if (e.getExceptionCode == INVALID_SESSION_ID) {
            //login again
            login();
            //retry on specific code
            r.run();
        }
    }
}

public void create(final SObject[] s){
    executeWithLogin(new Runnable() {
        public void run() {
            binding.create(s);
        }
    });
}

// same for other operations

你被迫使用详细的匿名类来做到这一点,但Java 8将使lambdas更具可读性和更简洁:

public void create(SObject[] s){
    executeWithLogin(() -> binding.create(s));
}