首页 > 解决方案 > 我应该在 Kotlin 中使用 Closable.use{...} 处理异常吗?

问题描述

根据来源Closable.use,如果发生错误,就会抛出异常。

public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
    var exception: Throwable? = null
    try {
        return block(this)
    } catch (e: Throwable) {
        exception = e
        throw e
    } finally {
        when {
            apiVersionIsAtLeast(1, 1, 0) -> this.closeFinally(exception)
            this == null -> {}
            exception == null -> close()
            else ->
                try {
                    close()
                } catch (closeException: Throwable) {
                    // cause.addSuppressed(closeException) // ignored here
                }
        }
    }

在大多数示例中Closable.use,不使用 try-catch,如下所示。为什么不需要错误处理?安全吗?

    BufferedReader(FileReader("test.file")).use { return it.readLine() }

标签: kotlin

解决方案


我们从 Kotlin 文档中看到该use函数的用途是什么:

在此资源上执行给定的块函数,然后无论是否引发异常都正确关闭它。

如果块函数成功完成或抛出异常,此函数会正确关闭资源。处理块函数的结果是您的责任。

如果抛出异常并且有办法处理它并继续执行代码,请使用 try/catch。如果对此无事可做并且控制权应该传递给调用者,则没有必要使用 try/catch。


推荐阅读