Scala ZIO.bracket: обработка ошибок при освобождении ресурса
Я хочу создать каталог, затем сделать что-то с каталогом и, наконец, удалить его. Я использую для этого скобку.
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 ответ
Основано на обсуждении 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 предназначены для охвата подавляющего большинства случаев.