3

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

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

更新、删除遵循相同的模式。查询方法接受不同的参数。

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的逻辑。有没有更好的方法来设计这些方法?

4

1 回答 1

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));
}
于 2013-07-12T22:14:25.837 回答