2

我不熟悉使用 vavr 进行编程的函数式风格。

我有一个方法在成功执行时返回数据,如果失败,则返回 MyCustomRunTimeException。

在我的服务类中,我正在调用这个 API 方法,当 API 方法失败时,我必须捕获异常并清除我的应用程序缓存并将相同的异常返回给调用者(在我的情况下是另一个服务方法)。

如果方法调用成功,我必须返回实际对象,而不是 Try 包装对象。

如何使用 vavr Try 来实现这一点?

我尝试在 vavr Try.recover 中使用不同的方法,但我无法抛出相同的异常。

如果有人可以提供,任何示例或片段都可能对我非常有帮助。

提前致谢。

例子:

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


method1(){

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

clearcache();
  throw ex;
 }
}
4

1 回答 1

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());
}

作为奖励,现在您的代码是明确的,您不会冒忘记处理错误的风险。

于 2019-08-08T21:52:24.753 回答