【问题标题】:How to add proper error handling to cats-effect's Resource如何为猫效应的资源添加适当的错误处理
【发布时间】:2019-02-06 17:29:18
【问题描述】:

我正在尝试使用cats-effect 以纯功能方式获取一些基本文件 IO(写入/读取)。在遵循this 教程之后,这是我最终读取文件的结果:

private def readFile(): IO[String] = for {
  lines <-  bufferedReader(new File(filePath)).use(readAllLines)
} yield lines.mkString

def bufferedReader(f: File): Resource[IO, BufferedReader] =
  Resource.make {
    IO(new BufferedReader(new FileReader(f)))
  } { fileReader =>
    IO(fileReader.close()).handleErrorWith(_ => IO.unit)
  }

现在在handleErrorWith 函数中,我可以记录发生的任何错误,但我怎样才能为此添加适当的错误处理(例如返回Resource[IO, Either[CouldNotReadFileError, BufferedReader]])?

【问题讨论】:

    标签: scala functional-programming scala-cats cats-effect


    【解决方案1】:

    可以通过在返回的 IO 值上使用 .attempt 来添加正确的错误处理:

    import scala.collection.JavaConverters._
    
    val resourceOrError: IO[Either[Throwable, String]] = bufferedReader(new File(""))
      .use(resource => IO(resource.lines().iterator().asScala.mkString))
      .attempt
    

    如果你想把它提升到你自己的 ADT 中,你可以使用leftMap:

    import cats.syntax.either._
    
    final case class CouldNotReadError(e: Throwable)
    
    val resourceOrError: IO[Either[CouldNotReadError, String]] =
      bufferedReader(new File(""))
        .use(resource => IO(resource.lines().iterator().asScala.mkString))
        .attempt
        .map(_.leftMap(CouldNotReadError))
    

    此外,您可能对ZIO 数据类型感兴趣,它具有supported cats-effect instances,并且与IO[E, A] 的形式略有不同,其中E 捕获错误效果类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 2014-08-09
      • 1970-01-01
      • 2019-09-19
      相关资源
      最近更新 更多