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 предназначены для охвата подавляющего большинства случаев.

Другие вопросы по тегам