Java 如何在Try.of()失败时引发异常?
如果Java 如何在Try.of()失败时引发异常?,java,vavr,resilience4j,Java,Vavr,Resilience4j,如果Try.ofCallable()失败,我想抛出从Exception扩展而来的异常 我有一个可调用的类型: final Callable<MyResponse> decoratedCallable = circuitBreakerService.getDecoratedMethod( myArg1, () -> myFunction(myArg1, myArg2, myArg3) ); 如果MyRuntimeExceptio
Try.ofCallable()
失败,我想抛出从Exception
扩展而来的异常
我有一个可调用的类型:
final Callable<MyResponse> decoratedCallable =
circuitBreakerService.getDecoratedMethod(
myArg1,
() -> myFunction(myArg1, myArg2, myArg3)
);
如果MyRuntimeExceptionA
和MyRuntimeExceptionB
extendruntimeexceptiona和MyRuntimeExceptionBextendruntimeexceptiona和MyRuntimeExceptionB,则这是可行的(包装上述两条语句的函数会抛出正确的异常MyRuntimeExceptionA和MyRuntimeExceptionB),但如果它们扩展exception
,则不可行
如果它们扩展了Exception
,则我无法从主函数中抛出它们。
IDE要求将它们封装在try/catch中,我不想这样做。我对vavr不太了解,但在javadoc中查找库时,可以看到onFailure方法需要一个消费者我对vavr不太了解,但在javadoc中查找库时,可以看到onFailure方法需要一个消费者您有两个选择。当您尝试打开try
时,可以通过以下代码获取值来抛出:
Try.ofCallable(decoratedCallable)
.getOrElseThrow(throwable -> {
if (throwable instanceof CallNotPermittedException) {
return new MyExceptionA("msg1", throwable);
} else {
return new MyExceptionB("msg2", throwable);
}
})
或者在使用类似代码展开之前,将错误映射代码移出到:
Try.ofCallable(decoratedCallable)
.mapFailure(
Case(
$(instanceOf(CallNotPermittedException.class)),
throwable -> new MyExceptionA("msg1", throwable)
),
Case($(), throwable -> new MyExceptionB("msg2", throwable))
)
.get()
这两种解决方案都只会在展开时抛出,因此如果您想尽早抛出,则必须尽早展开
否则,如果您正在使用Try
,我会采纳其他人在评论中发布的建议,不要抛出异常。使用Try
的关键在于使用总函数,而不是可能引发异常的部分函数。您有两个选择。当您尝试打开try
时,可以通过以下代码获取值来抛出:
Try.ofCallable(decoratedCallable)
.getOrElseThrow(throwable -> {
if (throwable instanceof CallNotPermittedException) {
return new MyExceptionA("msg1", throwable);
} else {
return new MyExceptionB("msg2", throwable);
}
})
或者在使用类似代码展开之前,将错误映射代码移出到:
Try.ofCallable(decoratedCallable)
.mapFailure(
Case(
$(instanceOf(CallNotPermittedException.class)),
throwable -> new MyExceptionA("msg1", throwable)
),
Case($(), throwable -> new MyExceptionB("msg2", throwable))
)
.get()
这两种解决方案都只会在展开时抛出,因此如果您想尽早抛出,则必须尽早展开
否则,如果您正在使用Try
,我会采纳其他人在评论中发布的建议,不要抛出异常。使用Try
的全部要点是使用总函数,而不是可能引发异常的部分函数。如果使用Vavr,没有返回Try
,这有什么特别的原因吗你似乎陷入了令人兴奋的新库的陷阱,而没有完全意识到它们存在或应该被使用的原因。尝试用标准Java编写相同的代码,看看它是如何工作的。使用Try
的主要目标是不抛出异常。在Vavr文档中可以找到更多关于为什么的上下文,关于如果您使用Vavr,您没有返回Try
?在这种(似乎减少了的)上下文中,您似乎落入了令人兴奋的新库的陷阱,而没有完全意识到它们存在或应该使用的原因。尝试用标准Java编写相同的代码,看看它是如何工作的。使用Try
的主要目标是不抛出异常。有关原因的更多上下文,请参见关于的Vavr文档
Try.ofCallable(decoratedCallable)
.mapFailure(
Case(
$(instanceOf(CallNotPermittedException.class)),
throwable -> new MyExceptionA("msg1", throwable)
),
Case($(), throwable -> new MyExceptionB("msg2", throwable))
)
.get()