Настройте сообщение об ошибке, используя Kotlin вместо try catch - PullRequest
0 голосов
/ 22 апреля 2020

Я все еще изучаю Kotlin, и я только что узнал об «использовании» и о том, как он заменяет попытки, улов и, наконец, блокировку. Однако мне любопытно, можно ли настроить его обработку исключений, например:

var connection: Connection? = null
try {
    connection = dataSource.connection
    connection.prepareStatement(query).execute()
} catch (e: SQLException) {
    logger.log("Specific error for that query")
    e.printStackTrace()
} finally {
    if (connection != null && !connection.isClosed) {
        connection.close()
    }
}

Этот код является моим текущим, у меня есть указанная ошибка c, которую я хотел бы отобразить в перехватчике, это возможно при использовании use? Это мой текущий код использования:

dataSource.connection.use { connection ->
    connection.prepareStatement(query).execute()
}

1 Ответ

3 голосов
/ 22 апреля 2020

Как прокомментировано @ 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.

...