ZIO не поймает исключение, если вы не включите его в ZIO
. Вы можете использовать ZIO.effect
, чтобы обернуть весь блок устаревших небезопасных исключений, генерирующих код, или просто использовать IO.fail
для конкретного исключения.
Я реорганизовал ваш код, чтобы он был более похож на ZIO, и вместо этого вывел сбой Task
исключения броска:
case class Test(ref: Ref[Vector[Int]]) {
def people(id: Int):Task[Int]=
for {
ints <- ref.get
int <- ZIO.effectTotal(ints.find(_ == id))
res <- int match {
case None => IO.fail(new IllegalArgumentException(s"No People with id $id"))
case Some(p) => ZIO.effectTotal(p)
}
} yield res
}
Для того, чтобы поймать IllegalArgumentException
, вам понадобится следующая складка:
...
.fold(
err => err shouldBe IllegalArgumentException("No People with id 2"),
_ => fail("line above should fail")
)
ServiceException
не должно появляться здесь, поскольку ничто не бросает ее.