【问题标题】:Handling errors in scala ZIO处理 scala ZIO 中的错误
【发布时间】:2019-08-15 01:07:07
【问题描述】:

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

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

【问题讨论】:

  • 为什么unsafeRun 在你的 IO 中间?我想你想要for { i &lt;- toINT("3"); _ &lt;- putStrLn(i.toString)} yield ()

标签: scala error-handling zio


【解决方案1】:

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

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

【讨论】:

  • 我知道了,但是如果不将结果包装在 monad 中,您将无法执行 map 或 catch,所以现在的问题是最好的包装器是什么?
【解决方案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)))

【讨论】:

  • 您可以将toInt 简化为:def toINT(s: String): Task[Int] = { Task.effect(s.toInt)) }。在ZIO 中,effect 表示“导入可能失败的代码(您可以使用Task.effect 进行可抛出,或使用ZIO.effect 进行通用错误管理。有关更通用的答案,请参阅:stackoverflow.com/questions/63712633/…
猜你喜欢
  • 2022-12-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 2019-06-16
  • 2014-03-28
  • 1970-01-01
  • 2015-11-24
  • 2021-07-17
相关资源
最近更新 更多