我仍然在学习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()
}
}该代码是我当前的代码,我想在捕获点上显示一个特定的错误,这是否可以使用use?这是我当前的使用代码:
dataSource.connection.use { connection ->
connection.prepareStatement(query).execute()
}发布于 2020-04-22 17:46:46
由@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内部还是在关闭资源时),该异常将被抛回给调用方,即您的代码。
作为边缘情况,您可以有两个异常,一个在执行block时,一个在关闭资源时。这是由closeFinally (其源在上面链接的同一个文件中可用)处理的,关闭资源时抛出的异常被添加为从block抛出的异常,这是因为方法只能抛出最多一个异常,所以他们必须选择抛出哪个异常。同样的情况也适用于Java中的try-语句。
https://stackoverflow.com/questions/61370861
复制相似问题