Scala ZIO.bracket:处理释放资源的错误

时间:2019-08-02 15:20:39

标签: scala zio

我想创建一个目录,然后对目录进行处理,最后将其删除。我为此使用了一个成语。

val fs: FileSystem = ???
val path = ???
ZIO.bracket[Any, Throwable, Path, Unit](
    acquire = ZIO{fs.mkdirs(path); path},
    release = p => ZIO.succeed(fs.delete(p, true)),
    use = p => ZIO{()})

删除目录显然是容易出错的操作。但是release函数必须始终成功。因此,我必须使用看起来错误的ZIO.succeed

如何正确关闭资源?

1 个答案:

答案 0 :(得分:2)

基于对gitter的讨论:https://gitter.im/ZIO/Core?at=5d44552a7a151629e10f68a3

release无法返回错误,因为否则将无法区分来自release的错误和来自use的错误。

可能的解决方案:

1)release = ZIO.succeed(action)-将错误变成不可恢复的错误。 release是安全的或者实际上是不可恢复的。

2)release = Task{action}.ignore-忽略潜在的错误。

3)将错误设为值。因此Zio.bracket的类型为ZIO[R, E, Either[FinalizerError, Good]]。当恢复真的很重要时。

1和2旨在涵盖绝大多数用例。