Scala ZIO.bracket: 处理释放资源的错误
Scala ZIO.bracket: handling errors of releasing resource
我想创建一个目录,然后对该目录进行一些处理,最后将其删除。我为此使用了方括号成语。
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
看起来不对。
如何正确关闭资源?
基于对 gitter 的讨论:https://gitter.im/ZIO/Core?at=5d44552a7a151629e10f68a3
release
不能 return 错误,否则无法区分来自 release
的错误和来自 use
的错误。
可能的解决方案:
1) release = ZIO.succeed(action)
- 将错误变成不可恢复的错误。
当 release
安全或确实无法恢复时。
2) release = Task{action}.ignore
- 忽略潜在错误。
3) 使错误成为一个值。所以 Zio.bracket
将是 ZIO[R, E, Either[FinalizerError, Good]]
类型。当恢复真的很重要时。
1 和 2 旨在涵盖绝大多数用例。
我想创建一个目录,然后对该目录进行一些处理,最后将其删除。我为此使用了方括号成语。
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
看起来不对。
如何正确关闭资源?
基于对 gitter 的讨论:https://gitter.im/ZIO/Core?at=5d44552a7a151629e10f68a3
release
不能 return 错误,否则无法区分来自 release
的错误和来自 use
的错误。
可能的解决方案:
1) release = ZIO.succeed(action)
- 将错误变成不可恢复的错误。
当 release
安全或确实无法恢复时。
2) release = Task{action}.ignore
- 忽略潜在错误。
3) 使错误成为一个值。所以 Zio.bracket
将是 ZIO[R, E, Either[FinalizerError, Good]]
类型。当恢复真的很重要时。
1 和 2 旨在涵盖绝大多数用例。