我正在尝试捕获特定的运行时异常(因此不能抛出)并且只记录它(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,因为它捕获所有异常和错误。
答案 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);
}
})