【问题标题】:using vavr how to catch and re-throw the same exception使用 vavr 如何捕获并重新抛出相同的异常
【发布时间】:2019-08-05 03:23:07
【问题描述】:

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

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

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

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

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

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

如果有人可以提供,任何示例或 sn-p 都可能对我很有帮助。

提前致谢。

例子:

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


method1(){

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

clearcache();
  throw ex;
 }
}

【问题讨论】:

  • 您能否提供一些示例代码来说明您的问题?
  • 添加示例

标签: vavr vavr-test


【解决方案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());
}

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

【讨论】:

  • 但在我的情况下,清除缓存后我必须重新抛出异常
  • 您测试过我的第一个解决方案吗?它会重新抛出你的异常。
  • 问题在于.getOrElseThrow() 将任何捕获的异常向下转换为Throwable。所以我们对异常类型的控制很差
  • 什么意思,垂头丧气?将抛出的异常仍然是 MyCustomRunTimeException。您仍然可以稍后捕获 MyCustomRunTimeException。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2013-10-04
  • 2010-10-03
  • 2011-06-27
  • 2012-07-25
  • 2020-02-13
相关资源
最近更新 更多