Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Vavr(以前称为Javaslang)库捕获特定的运行时异常?_Java_Vavr - Fatal编程技术网

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

如何使用Vavr(以前称为Javaslang)库捕获特定的运行时异常?,java,vavr,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 }

我正试图捕获一个特定的运行时异常(因此不可丢弃),并记录它(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()))
我得到:

返回类型无效无法转换为无效


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

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

因此,代码将是:

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

编辑

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

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

我正在寻找一种更干净的方法,如果不恢复其他一些API调用,但我在文档和文档中找不到任何东西。yes sayHello()返回void。如果我必须为每个log语句返回null,那么我最好使用Java的常规try/catch,因为它看起来更干净,而failure方法似乎接受throwable。我不想捕捉throwable,因为它将捕捉所有异常和错误。我只想抓住我的感觉。请澄清如果MyApprintMeException的可丢弃实例检查失败会发生什么?是的,但我想根据我的问题是,如果检查失败,它应该正常抛出。因为我只想捕获一个特定的异常并抛出其他所有异常。在您提供的上述示例中,我确实可以在发生
MyApprumenteMeException
时记录,但如果出现任何其他异常,我也将保持沉默。如果有任何其他异常或错误,我不想保持沉默。听起来Vavr还不够成熟,无法处理异常!好的,我不知道你不清楚什么。但我的目标很简单。当我得到一个特定的异常,即“MyAppRuntimeException”时,我想记录日志,如果出现任何其他运行时异常或错误,我想让它们像任何其他Java程序一样被抛出。在您提供的示例中,它将保持沉默,因为它是可丢弃的。这够清楚吗?