如何使用Vavr(以前称为Javaslang)库捕获特定的运行时异常?
我正试图捕获一个特定的运行时异常(因此不可丢弃),并记录它(log.error有一个void返回类型)。在vavr中,最简单的方法是什么如何使用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 }
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程序一样被抛出。在您提供的示例中,它将保持沉默,因为它是可丢弃的。这够清楚吗?