4

我正在尝试捕获特定的运行时异常(因此不可抛出)并记录它(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 的替代方法,因为它可以捕获所有异常和错误。

4

1 回答 1

3

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

所以代码将是:

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

看看文档

编辑

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

Try
   .run(this::sayHello)
   .onFailure(throwable -> {
      if (throwable instanceof MyAppRuntimeException) {
         log.error("Error occured: {}", throwable.getMessage());
      } else {
         throw new RuntimeException(throwable);
      }
   })
于 2017-10-16T16:55:44.493 回答