Как прокомментировано @ Tenfour04 и из документации
[use
] Выполняет указанную функцию блокировки для этого ресурса и затем корректно закрывает ее, независимо от исключения Брошен или нет.
В частности, он реализован следующим образом:
public inline fun <T : AutoCloseable?, R> T.use(block: (T) -> R): R {
var exception: Throwable? = null
try {
return block(this)
} catch (e: Throwable) {
exception = e
throw e
} finally {
this.closeFinally(exception)
}
}
Этот фрагмент кода должен выглядеть знакомым, если вы Java разработчик, но в основном он выполняет block
, передавая this
(т.е. объект-получатель) в качестве аргумента для вашего блока кода. В конце он закрывает ресурс AutoCloseable
. Если в какой-то момент выдается исключение (либо внутри block
, либо при закрытии ресурса), это исключение выдается обратно вызывающей стороне, т. Е. Вашему коду.
В качестве пограничного случая вы можете иметь 2 исключения, один при выполнении block
и один при закрытии ресурса. Это обрабатывается closeFinally
(источник которого доступен в том же файле, указанном выше), и исключение, выбрасываемое при закрытии ресурса, добавляется как исключенное исключение к исключению, выданному из block
, - потому что только 1 исключение может быть брошенным методом, поэтому они должны были выбрать, какой бросить. То же самое относится и к оператору try-with-resources в Java.