Обработка ошибок в scala ZIO - PullRequest
1 голос
/ 04 июля 2019

Я хотел обработать некоторые исключения в 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))
  }

код прошел успешно, если я передал правильный номер формата, но он не может обработать исключение, если я передал неправильный формат и идею ??

1 Ответ

3 голосов
/ 04 июля 2019

s.toInt оценивается вне монады IO.Происходит следующее: сначала вы оцениваете s.toInt и пытаетесь передать результат этого в IO.succeed, но перед тем, как что-либо передать в IO.succeed, уже было сгенерировано исключение.Название succeed уже в основном говорит о том, что вы уверены, что все, что вы передаете, является простым значением, которое не может дать сбой.

В документах предлагается использовать Task.effect, IO.effect или ZIO.effect для подъемаэффект, который может потерпеть неудачу в ZIO.

...