代码之家  ›  专栏  ›  技术社区  ›  Florian Baierl

如何在cats效果的资源中添加正确的错误处理

  •  4
  • Florian Baierl  · 技术社区  · 7 年前

    我正试图用一种纯功能的方式,使用 cats-effect 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]]

    1 回复  |  直到 7 年前
        1
  •  8
  •   Yuval Itzchakov    7 年前

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

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

    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

    推荐文章