4

我想创建一个目录,然后对目录做一些事情,最后删除它。我为此使用了括号成语。

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看起来错误的。

如何正确关闭资源?

4

1 回答 1

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将是 type ZIO[R, E, Either[FinalizerError, Good]]。什么时候恢复真的很重要。

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

于 2019-08-02T21:30:14.513 回答