将RuntimeException视为ServerSOAPFaultException

时间:2019-05-01 12:02:46

标签: java exception vavr

为什么要输入以下代码:

/.../
.onFailure(exc ->
                        Match(exc).of(
                                Case($(instanceOf(ServerSOAPFaultException.class)), handleServerSOAPFaultException(exc)),
                                Case($(instanceOf(Exception.class)), handleDefaultException(exc))
                        ))
                .getOrElseGet(exc -> false);

当异常为RuntimeException时调用第一种情况。 RuntimeException不是ServerSOAPFaultException的实例。

1 个答案:

答案 0 :(得分:0)

这是Java问题,而不是特定于Vavr的问题:在Java中,如果您编写foo(a, b),则ab都将被评估,然后再评估foo(a, b) (称为“渴望”)。

因此,要评估Match().of(),它必须评估所有Case()。要评估每个Case(),它必须评估handleServerSOAPFaultException(exc)

如果仅在大小写匹配时才想评估handleServerSOAPFaultException(exc),则需要使其成为惰性调用,即函数,即Supplier

/.../
.onFailure(exc ->
                        Match(exc).of(
                                Case($(instanceOf(ServerSOAPFaultException.class)), () -> handleServerSOAPFaultException(exc)),
                                Case($(instanceOf(Exception.class)), () -> handleDefaultException(exc))
                        ))
                .getOrElseGet(exc -> false);