gpt4 book ai didi

java - 将异常作为方法参数处理

转载 作者:行者123 更新时间:2023-11-30 06:16:55 28 4
gpt4 key购买 nike

我正在寻找一种设计模式来处理作为方法参数接收的 Exception 实例。

为了说明问题的背景,我正在使用 GWT 并且有各种异步处理程序,这些处理程序通常以类似于以下的形式出现:

public interface AsyncCallback<T> {

void onFailure(Throwable caught);

void onSuccess(T result);

}

因此,onFailure 方法接收到一个我需要处理的 Throwable 实例。

现在,我可以在这个方法中接收到一些异常,例如

  • ConstraintViolationException
  • TimeoutException
  • NoSuchElementException

在我的处理代码中,我当然可以编写以下内容:

void handleException(final Exception e) {
if(e instanceof TimeoutException) {
handleTimeout();
} else if (e instanceof NoSuchElementException) {
handleInvalidElement();
} else {
stopAndCatchFire();
}
}

但在我看来,这看起来非常丑陋。大型 if..else if 链与 instanceof 的大量使用相结合似乎应该避免。

我想也许我可以使用 try...catch 构造来处理 Exception,方法如下:

void handleException(final Exception e) {
try {
throw e;
} catch (TimeoutException te) {
handleTimeout();
} catch (NoSuchElementException nsee) {
handleInvalidElement();
} catch (Exception ex) {
stopAndCatchFire();
}
}

但这在某种程度上似乎是一种滥用。您认为第二种方法或我可以采用的另一种方法有什么缺点可以避免第一种情况吗?

最佳答案

你能不能有一个 exceptionHandlers 的字典,以它们处理的异常类型为键,然后当你得到一个异常时,你在字典中查找异常类型的处理程序。如果有,则将异常传递给处理程序,如果没有则使用默认处理程序。

所以你的处理程序变成这样:

void handleException(final Exception e) {
if (handlers.containsKey(e.getType())
{
handlers[e.getType()].handle(e);
}
else
{
defaultHandler.handle(e);
}
}

我的 Java 有点生疏,所以这个例子是 c-sharpy 但应该足够简单来翻译(虽然我记得不要把所有的首字母都大写 :))

这种方法的优点是您可以简单地添加新的处理程序。

但是,如果您对子类型使用相同的处理程序,则会受到影响,因为您必须显式注册每个子类型。

要解决这个问题,只需让每个处理程序负责决定它是否可以处理异常:

public interface ExceptionHandler
{
bool canHandle(Exception e);
void handle(Exception e)
}

然后只需将处理程序放在一个列表中,然后迭代询问每个处理程序是否可以处理当前异常,当您找到一个可以处理时,就让它处理它。

关于java - 将异常作为方法参数处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26527060/

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