处理 scala ZIO 中的错误

Handling errors in 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))
  }

如果我传递了一个有效的格式编号,代码会成功,但是如果我传递了无效的格式和想法,它就无法处理异常??

s.toIntIO monad 之外进行评估。发生的情况是您首先评估 s.toInt 并尝试将其结果传递给 IO.succeed,但是在您将任何内容传递给 IO.succeed 之前已经抛出异常。 succeed 的名称基本上已经表明您确信无论您传递给它的是一个不会失败的普通值。

文档建议使用 Task.effectIO.effectZIO.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)))