gpt4 book ai didi

Scala ZIO.bracket : handling errors of releasing resource

转载 作者:行者123 更新时间:2023-12-01 03:06:07 25 4
gpt4 key购买 nike

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

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不能返回错误,否则将无法区分来自 release 的错误和来自 use 的错误.

可能的解决方案:

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

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

3) 使错误成为一个值。所以Zio.bracket类型为 ZIO[R, E, Either[FinalizerError, Good]] .当恢复真的很重要时。

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

关于Scala ZIO.bracket : handling errors of releasing resource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57329390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com