在Scala中可以在实际Try
上下文之外使用Success
(Failure
/ Exception
)作为可以成功或失败的函数的返回类型吗? ?
答案 0 :(得分:3)
Try
的实例是Success
或Failure
,其中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
。
解决评论时要考虑
Valid/Invalid
,来自猫:https://typelevel.org/cats/datatypes/validated.html 在这两种情况下,您都不必使用异常。
这是一个例子
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
这样丰富的方法集,这很难理解。