使用“尝试异常情况”上下文

时间:2019-07-07 09:59:34

标签: scala error-handling

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

2 个答案:

答案 0 :(得分:3)

Try的实例是SuccessFailure,其中Failure

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

请注意,Failure必须与Throwable一起构造,因此我认为Try应该在Throwable的上下文中使用。所以我们不能做

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

请考虑在异常上下文之外使用Either而不是Try


解决评论时要考虑

在这两种情况下,您都不必使用异常。

这是一个例子

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

答案 1 :(得分:3)

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

我要说的是,使用Try的全部目的是将Throwable实例移出异常上下文,并将其放在可以在程序中任何地方使用的对象中。如果仅打算在异常上下文中使用Try,为什么会有flatMap这样丰富的方法集,这很难理解。