scala - 如何为 cat-effect 的资源添加正确的错误处理

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

我正在尝试使用 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]] )?

最佳答案

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

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捕获错误效果类型。

关于scala - 如何为 cat-effect 的资源添加正确的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54548901/

相关文章:

postgresql - 使用 spray-json、Slick 和 PostgreSQL 的 DateTime 堆栈溢出

java - 从 Java 创建 `KafkaServer`

mysql - 如何在MySQL中减去上一年,但添加月份?

functional-programming - Elm 中是否有等效的 JavaScript reload()

scala - 如何将 free monad 与 Future[M[_]] 一起使用

scala - 条件状态 monad 表达式

scala - scala.js 1.0 中的@JSGlobalScope(JavaScriptException、ReferenceError、var 未定义)

ios - 跳出 filter() 函数

scala - 如何将 Future 的分离转换为分离的 Future

scala - Scala 中的 JavaConverters 和 JavaConversions 有什么区别?