如何使用Vavr(以前称为Javaslang)库捕获特定的运行时异常?

时间:2017-10-16 16:20:20

标签: java vavr

我正在尝试捕获特定的运行时异常(因此不能抛出)并且只记录它(log.error有一个void返回类型)。在vavr中执行此操作的最简单方法是什么?

try {
    sayHello();
} catch (MyAppRuntimeException ex) {
    log.error("Error occured") // log.error returns void not Void so I couldn't find a suitable method in  Vavr library
}

我试过了

Try.run(() -> sayHello())
   .recover(MyAppRuntimeException.class, ex->log.error("Error occured: {}", ex.getMessage()))

我明白了:

  

错误的返回类型void无法转换为Void

如果.recover不是正确的方法,请建议替代方案,我可以捕获我的一个特定的异常但不是Throwable,因为它捕获所有异常和错误。

1 个答案:

答案 0 :(得分:2)

很容易解释。你的方法 - 它没有明确说明,但我假设基于错误消息返回void。由于recover还必须返回一个值 - 需要进一步处理 - 与它包装的方法返回的类型兼容,它必须返回Void,所以:

所以代码将是:

Try
   .run(this::sayHello)
   .recover(MyAppRuntimeException.class, e -> {
      log.error("Error occured: {}", e.getMessage());
      return null;
   });

查看docs

修改

在评论中讨论后发现恢复不是所需要的。此函数用于提供恢复值,而不是记录语句,因此onFailure + instanceof(而不是模式匹配)似乎可以完成这项工作:

Try
   .run(this::sayHello)
   .onFailure(throwable -> {
      if (throwable instanceof MyAppRuntimeException) {
         log.error("Error occured: {}", throwable.getMessage());
      } else {
         throw new RuntimeException(throwable);
      }
   })