处理Scala ZIO中的错误

时间:2019-07-04 10:23:58

标签: scala error-handling scalaz-zio

我想使用下面的catchAll或catchSome处理ZIO中的一些异常:

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 个答案:

答案 0 :(得分:3)

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

文档建议使用Task.effectIO.effectZIO.effect来提升可能无法进入ZIO的效果。

答案 1 :(得分:2)

这是一个对我有用的程序:

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)))