Обработка ошибок в 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)))
Другие вопросы по тегам