1

我想使用 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))
  }

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

4

2 回答 2

3

s.toIntIO在单子之外进行评估。发生的情况是您s.toInt首先评估并尝试将结果传递给IO.succeed,但是在您可以将任何内容传递给之前已经引发了异常IO.succeed。名字succeed已经基本表明你确定你传递的任何东西都是一个不会失败的普通值。

文档建议使用Task.effect,IO.effectZIO.effect来提升可能失败的效果ZIO

于 2019-07-04T11:47:13.663 回答
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)))
于 2019-08-14T16:46:23.290 回答