Используя 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());
}
В качестве бонуса, теперь ваш код является явным, и вы не рискуете забыть обработать ошибку.