0

在我的 GWT 客户端中,我试图确保始终处理Throwable传递给我的Callback#onFailure()实现,因为这个庞大的代码库中的许多实现对此没有做任何事情。

为此,我定义了我自己的,它在我自己的实现RemoteServiceProxy#doCreateRequestCallback()中包装了每一个。Callback在那种#onFailure()方法中,我想使用我自己的 a 版本,Throwable以便我可以跟踪它是否被处理,例如。什么时候Throwable#getMessage()被调用,所以我将它传递给原来的Callback#onFailure().

public class ThrowableProxy extends Throwable {
    private Throwable delegate;
    private boolean handled;

    public ThrowableProxy(Throwable delegate) {
        this.delegate = delegate;
        this.handled = false;
    }

    // Overriding Throwable's methods to defer to the delegate

    // package protected
    boolean isHandled() {
        return this.handled;
    }
}

这一切看起来都很好,直到你点击instanceof。现在,如果客户端代码想要检查异常的类型,例如。throwable instanceof StatusCodeException, Throwable 是 的一个实例ThrowableProxy,但我真正想要的是检查委托的类型。

instanceof是如何工作的?我可以以某种方式让它检查代表而不做类似的事情throwable.getDelegate() instanceof StatusCodeException吗?

4

2 回答 2

0

instanceof 就像在常规 Java 中一样工作——您不能为 ThrowableProxy “覆盖”它。

我不完全确定您想要完成什么,但是您可以让所有回调扩展您自己的类,并要求它们调用handledFailure(ex) 方法,如果onFailure 返回而没有调用它,您可以做一些事情。当然,如果您正在修改代码以进行该调用,您可以轻松地修改它以实际处理故障。

顺便说一句,我认为使用 instanceof 来检查类型的洗衣清单是一种代码味道,并且表明您可能需要一个通用的超类来编码您正在检查的任何内容。

于 2013-07-23T15:16:50.027 回答
0

我不确定您要在这里完成什么,如果您详细说明您要在这里完成什么,那将非常有帮助。但这是我根据您提供的信息看到的......

如果您尝试针对客户端中的各种异常检查 instanceof,您最终会碰壁,因为客户端中并非所有异常都可用,请记住,客户端将在编译时运行 Javascript,并且需要考虑一些限制,并且包括一组有限的例外。在客户端实现集中错误处理的一个好方法是使用:

GWT.setUncaughtExceptionHandler

这允许您实现一个UncaughtExceptionHandler,它最终将捕获应用程序中未明确处理的所有异常。一个很好的方法是实现您自己的应用程序特定运行时异常,这将允许您进行明显需要的精细处理。

这是一个疯狂的猜测,因为我真的不明白你的目标是什么。

于 2013-07-23T22:20:08.170 回答