【问题标题】:Java `instanceof` and composition of a Throwable in onFailureJava `instanceof` 和 onFailure 中 Throwable 的组合
【发布时间】:2013-07-23 15:06:12
【问题描述】:

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

为此,我定义了自己的RemoteServiceProxy#doCreateRequestCallback(),它在我自己的实现中包装了每个Callback。在那个#onFailure() 方法中,我想使用我自己的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之类的事情就让它检查委托吗?

【问题讨论】:

  • 我认为您错过了问题的重点,我正在尝试找出是否有办法让instanceof 考虑代表,或解决此问题的其他方法。我考虑过覆盖#getClass(),但我找不到任何支持它的文档。
  • 我现在很不理解。代理类也将实现一个接口;你可以制作一个通用的标记界面。除了委派一个也可以使用setCause/getCause
  • 你不能做你想做的事。就这么简单。
  • 那么,你想要这种效果吗? StatusCodeException.class.isInstance(throwable) 还是我完全误解了这一点?

标签: java gwt instanceof


【解决方案1】:

instanceof 的工作方式与常规 Java 中的一样——您不能为 ThrowableProxy “覆盖”它。

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

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

【讨论】:

  • 关于你的最后一句话,他的意思是客户端代码可能使用instanceof - 所以这意味着他无法控制它。无论如何,instanceofcatch 块中通常更容易接受。
【解决方案2】:

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

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

GWT.setUncaughtExceptionHandler

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多