我有几种方法可以执行相同类型的错误处理并希望重构它。我的类中的所有方法X
都调用binding.X
,其中binding
是我的依赖类(第三方/ 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);
}
}
}
更新,删除后面是相同的模式。 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上。有没有更好的方法来设计这些方法?
答案 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));
}