使用尝试出异常上下文



在Scala中,在实际Exception上下文外使用Try(Success/Failure(可以作为可以成功或失败的函数的返回类型吗?

当然可能在异常上下文之外使用 Try;我一直都这样使用。这并不一定意味着它是"可接受的":(

我会说,使用Try的重点是将Throwable实例从异常上下文中删除,并将其放在可以在程序中任何地方使用的对象。很难理解为什么Try只有在异常上下文中使用的情况下使用如此丰富的方法(例如flatMap(。

Try的实例是SuccessFailure,其中Failure

case class Failure[+T](exception: Throwable)

请注意必须如何使用Throwable构建Failure,因此我认为Try应在Throwable s的上下文中使用。所以我们不能做

之类的事情
def foo: Try[Int] = {
  Failure(42) // Error: type mismatch; found : Int(42) required: Throwable
}

考虑使用Either代替Try外部异常上下文。


解决评论考虑

  • Valid/Invalid来自猫:https://typelevel.org/cats/datatypes/validated.html
  • 用自己的成功和失败情况定义自己的ADT,然后在这些情况下包装功能

在这两个中,您都不被迫使用异常。

这是一个示例

sealed trait MyValidationADT[T]
case class Good[T](result: T) extends MyValidationADT[T]
case class Bad[T](result: T) extends MyValidationADT[T]
def foo(i: Int): MyValidationADT[Int] = Bad(42)
foo(11) match {
  case Good(result) => "woohoo"
  case Bad(result) => "boom"
}

输出

res0: String = boom

最新更新