RuntimeException обрабатывается как ServerSOAPFaultException - PullRequest
0 голосов
/ 01 мая 2019

Почему следующий код:

/.../
.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 голосов
/ 02 мая 2019

Это проблема Java, а не специфичная для Vavr: в Java, если вы напишите foo(a, b), тогда и a, и b будут оцениваться до того, как 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);
...