Это является продолжением до моего предыдущего question:Как реорганизовать функцию, которая бросает исключения с Scalaz или Cats
Пусть я рефакторинга такую функцию:
def check(ox: Option[Int]): Unit = ox match {
case None => throw new Exception("X is missing")
case Some(x) if x < 0 => throw new Exception("X is negative")
case _ =>()
}
Я пишу новая чистая функция doCheck
, чтобы вернуть либо Unit
, либо исключение.
case class MissingX() extends Exception("X is missing")
case class NegativeX(x: Int) extends Exception(s"$x is negative")
import scalaz._, Scalaz._
type Result[A] = Excepiton \/ A
def doCheck(ox:Option[Int]): Result[Unit] = for {
x <- ox toRightDisjunction MissingX()
_ <- (x >= 0) either(()) or NegativeX(x)
} yield()
, а затем вызвать его из check
def check(ox:Option[Int]): Unit = doCheck(ox) match {
case -\/(e) => throw e
case _ =>()
}
ли смысл? Было бы лучше реализовать doCheck
?
def doCheck(ox:Option[Int]): Result[Int] = for {
x1 <- ox toRightDisjunction MissingX()
x2 <- (x1 >= 0) either(x1) or NegativeX(x1)
} yield x2
Как реализовать это с cats
?
Почему вы до сих пор бросить исключение в 'check'? –
@PeterNeyens Я не хочу менять весь код вне 'check'. – Michael