gpt4 book ai didi

java - 可插拔错误处理策略

转载 作者:行者123 更新时间:2023-12-03 07:41:20 26 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

3年前关闭。




Improve this question




我有服务对象(服务 A),它有一些特定的重复异步任务。该服务对象也有一个监督对象(服务 B)。我想处理与服务 A 中的特定任务有关的大部分错误,并且仅在需要采取任何其他措施时才通知服务 B(例如,当服务 A 不知道如何处理错误时)。

由于服务 A 依赖于外部资源(例如网络可用性),因此可以抛出许多不同的异常,我现在还不知道所有这些异常。

因此,我还希望在 Service A 中有一个可插入的错误处理策略,以便它可以以不同的方式处理不同的异常。我想使用我的 IoC 容器插入这些策略。

示例 A:
服务 A 应该每 30 秒下载一次。 (轮询),但 URL 格式错误,因此会引发 MalformedURLException。 A 查找 MalformedURLExcpetion 的错误处理策略,在这种情况下,该策略将意味着取消下载并通过回调通知服务 B(主管)。

示例 B:
服务 A 应该下载一些东西,但无法解析主机名。再次抛出异常(抱歉,现在不知道确切的类型)并且将查找相应的策略:在这种情况下,应该停止下载并在另一个时间重试,直到达到某个阈值。

我现在的问题:我应该如何实现错误处理策略和策略本身的动态查找?有这样的模式吗?

最佳答案

好吧,最简单直接的解决方案是使用普通的 java try catchs,不是那么灵活,但通常足够有用,因为错误处理策略不会经常改变。那些您无法捕获的异常在方法上声明为可能被抛出,并且可能由您的对象 B 处理。

如果你想更灵活。为您的服务 A 创建一个接口(interface),并声明所有可能的异常。使用逻辑实现该接口(interface),但不进行任何错误处理。然后,您可以创建也实现该接口(interface)的 ErrorStrategy 对象,并将传入调用委托(delegate)给该接口(interface)的另一个实现,但是这是有趣的部分,它为一个或多个特定异常附加了一些错误处理策略。这是一个示例,以使其更易于理解。

public interface A {
void someMethod() throws IOException, MalformedURLException;
}

class AImpl implements A {
@Override
public void someMethod() throws IOException, MalformedURLException {
// here goes your business logic
}
}

class ErrorHandlerOne implements A {

@Override
public void someMethod() throws IOException {
try {
delegate.someMethod();
} catch (MalformedURLException e) {
// handle the exception
}
}
}

如果你想更加灵活,我会推荐使用 AOP 机制而不是简单的委托(delegate)链,这样你可以很容易地插入和交换你的错误处理策略。如果您使用 Spring 并且您的 Service A 是 Spring-Bean,您可以轻松地使用 Springs 构建 AOP 支持。在这种情况下, throw 后的建议就是您要寻找的。

抛出通知后:如果方法因抛出异常而退出,则要执行的通知。
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterThrowing;

@Aspect
public class AfterThrowingExample {

@AfterThrowing(
pointcut="com.xyz.myapp.A.someOperation()"
throwing="ex")
public void doRecoveryActions(IOException ex) {
// ...
}
}

关于java - 可插拔错误处理策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2236063/

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