Используя vavr как поймать и перекинуть одно и то же исключение

Я новичок в функциональном стиле программирования с использованием vavr.

У меня есть метод возвращает данные, когда его успешно выполнено и, если это не удается, он возвращает MyCustomRunTimeException.

В моем классе Service я вызываю этот метод API, когда метод API не работает, я должен перехватить исключение и собираться очистить кэш приложения и вернуть то же исключение вызывающей стороне (в моем случае это еще один метод службы).

если вызов метода успешен, я должен вернуть реальный объект, а не обернутый объект Try.

Как я могу добиться этого с помощью vavr Try?

Я пытался использовать разные методы в vavr Try.recover, но я не могу выдать то же исключение.

Любой пример или фрагмент может быть очень полезным для меня, если некоторые могут предоставить.

Заранее спасибо.

Пример:

Foo doFoo() {
  throw new MyCustomRunTimeException();
}


method1(){

   try{
      doFoo();
  }catch(MyCustomRunTimeException ex){

clearcache();
  throw ex;
 }
}

1 ответ

В принципе, если ваша функция генерирует ошибку, вы хотите что-то сделать (в случае сбоя), а затем снова ее генерировать? Как насчет этого?

Foo doFoo() {
  throw new MyCustomRunTimeException();
}


Foo myService() {
  return Try.of(() -> doFoo())
    .onFailure(e -> clearCache())
    .getOrElseThrow(identity());
}

Если можно: так как вы хотите попробовать функциональный стиль, мы обычно не полагаемся на исключения в FP, вместо этого мы полагаемся на типы, которые представляют возможность отказа, например Either<MyBusinessProblem, Foo>,

Тогда ваш код будет выглядеть так:

Either<MyBusinessProblem, Foo> doFoo() {
  return Left.of(new MyBusinessProblem());
}


Either<MyBusinessProblem, Foo> doFoo() myService() {
  return doFoo()
    .peekLeft(businessProblem -> clearCache());
}

В качестве бонуса, теперь ваш код является явным, и вы не рискуете забыть обработать ошибку.

Другие вопросы по тегам