Java 是否允许抛出返回Try的方法?

Java 是否允许抛出返回Try的方法?,java,exception,api-design,vavr,Java,Exception,Api Design,Vavr,我们在项目中使用它来简化异常处理。我始终确保返回a的方法永远不会抛出任何东西,例如: public Try someSafeMethod(){ 返回Try.of(()->someService.generateId()) .map(someOtherService::getValueForId) .map(mappingService::mapToResult); } 但我的一些同事会这样实施: public Try someSafeMethod(){ 字符串generateId=someSe

我们在项目中使用它来简化异常处理。我始终确保返回a的方法永远不会抛出任何东西,例如:

public Try someSafeMethod(){
返回Try.of(()->someService.generateId())
.map(someOtherService::getValueForId)
.map(mappingService::mapToResult);
}
但我的一些同事会这样实施:

public Try someSafeMethod(){
字符串generateId=someService.generateId();//someOtherService.getValueForId(generateId))
.map(mappingService::mapToResult);
}
认为如果ID的生成有问题,他们宁愿抛出异常,而不是返回的
Try
失败

文档并不禁止返回
Try
的方法不抛出,但它确实说明:

Try是一个一元容器类型,它表示一个计算,可能导致异常,或者返回一个成功计算的值


我是不是太严格了?假设您使用一个API,其中所有方法都返回一个
Try
,当它们仍然抛出时,这不是很糟糕吗?

您没有太严格

使用
Try
作为返回值的全部意义在于使用全部函数进行编程以及采用可组合的方式处理错误所带来的好处。Total函数是始终为所有可能的参数值返回声明的返回类型值的函数。如果它们抛出异常,它们的函数就不再是total函数,如果没有显式的错误处理,非totality将通过它们的代码进行传递,“感染”调用它们的所有其他函数。因此,他们最终将得到更难推理的代码,并且需要更多的努力来确保它是正确的


在使用
Try
时抛出异常也会违背首先使用
Try
的目的,并且会不必要地使使用API的代码复杂化,而没有明显的好处,因为API使用者将不得不使用
Try
和捕获异常来进行错误处理。

我个人更希望您认为所有“失败”都是通过返回值返回的。从界面用户声明Try作为返回值的角度来看,我希望我可以依赖于以这种方式返回所有失败(否则我将不得不对失败执行两种不同的处理),但这真的不应该作为一个好的实践:你正在采用一个不同的控制模型,并且应该始终如一地使用它。