gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:17:26 25 4
gpt4 key购买 nike

我有几个方法执行相同类型的错误处理并想重构它。我类中的所有方法 X 都调用 binding.X,其中 binding 是我的依赖类(第三方/Salesforce soap API,因此我们没有控制抛出的异常类型)。 X可以是创建更新删除查询。对于所有这些方法,我必须检查异常代码是否为 session 过期,然后再次登录并重试该方法。

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

最佳答案

您可以将每个操作包装到一个策略中:

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 将通过 lambda 使它更具可读性并且更不冗长:

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

关于java - 更好地设计跨方法的常见错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17624669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com