Обработка ошибок в scala ZIO
Я хотел обработать некоторые исключения в ZIO, используя catchAll или catchSome, как показано ниже:
object Test extends App {
def run(args: List[String]) =
myApp.fold(_ => 1, _ => 0)
val myApp =
for {
_ <- putStrLn(unsafeRun(toINT("3")).toString)
} yield ()
def toINT(s: String): IO[IOException, Int]= {
IO.succeed(s.toInt).map(v => v).catchAll(er =>IO.fail(er))
}
код успешно выполнен, если я передал правильный номер формата, но он не может обработать исключение, если я передал неправильный формат и идею??
2 ответа
s.toInt
оценивается за пределами IO
монада. Что происходит, что вы оцениваете s.toInt
сначала и попробуйте передать результат этого IO.succeed
, но исключение уже было выдано, прежде чем вы сможете передать что-либо IO.succeed
, Имя succeed
уже в основном говорит, что вы уверены, что все, что вы передаете, является простым значением, которое не может потерпеть неудачу.
Документы предлагают использовать Task.effect
, IO.effect
, или же ZIO.effect
для снятия эффекта, который может потерпеть неудачу в ZIO
,
Вот программа, которая работала для меня:
val program =
for {
int <- toINT("3xyz")
_ <- putStrLn(int.toString)
} yield ()
def toINT(s: String): Task[Int] = {
ZIO.fromTry(Try(s.toInt))
}
rt.unsafeRun(program.catchAll(t => putStrLn(t.getMessage)))