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
extend
runtimeexceptiona和MyRuntimeExceptionB
extend
runtimeexceptiona和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()