returns 一个 Try 允许抛出的方法吗?

Is a method that returns a Try allowed to throw?

我们正在使用 Vavr in our project to ease exception handling. I always make sure that a method that returns a Try 永远不会抛出任何东西,就像这样:

public Try<Result> someSafeMethod() {
  return Try.of(() -> someService.generateId())
           .map(someOtherService::getValueForId)
           .map(mappingService::mapToResult);
}

但我的一些同事会这样实现它:

public Try<Result> someSafeMethod() {
  String generatedId = someService.generateId(); // <- Might throw an Exception that is not caught by the Try clause
  return Try.of(() -> someOtherService.getValueForId(generatedId))
           .map(mappingService::mapToResult);
}

争辩说,如果 ID 的生成有问题,他们宁愿抛出异常,而不是 returned Try 失败。

文档不禁止 returning a Try 的方法不应该抛出,但它确实声明:

Try is a monadic container type which represents a computation that may either result in an exception, or return a successfully computed value.

我是不是太严格了?想象一下,您将使用一个 API,其中所有方法 return 一个 Try,当它们仍然抛出时不是很糟糕吗?

你还不算太严格

Try 用作 return 值的全部意义在于使用全部函数进行编程并具有可组合的错误处理方式的好处。总函数是始终 return 声明的 return 类型值的函数,用于所有可能的参数值。如果它们抛出异常,它们的函数就不再是完整函数,并且——如果没有明确的错误处理——非完整性将通过它们的代码传递传递,'infecting' 所有其他调用它们的非完整性函数。因此,他们最终会得到更难推理的代码,并且需要更多的努力来确保它是正确的。

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