Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该在Kotlin中使用Closable.use{…}处理异常吗?_Kotlin - Fatal编程技术网

我应该在Kotlin中使用Closable.use{…}处理异常吗?

我应该在Kotlin中使用Closable.use{…}处理异常吗?,kotlin,Kotlin,根据Closable.use的来源,如果发生错误,将引发异常 public-inline-fun T.use(块:(T)->R:R{ 变量异常:可丢弃?=null 试一试{ 返回块(本) }捕获(e:可丢弃){ 异常=e 掷e }最后{ 什么时候{ APIVersionSatLeast(1,1,0)->this.closeFinally(异常) this==null->{} 异常==null->close() 其他-> 试一试{ 关闭() }捕获(关闭异常:可丢弃){ //cause.addsu

根据
Closable.use的来源,如果发生错误,将引发异常

public-inline-fun T.use(块:(T)->R:R{
变量异常:可丢弃?=null
试一试{
返回块(本)
}捕获(e:可丢弃){
异常=e
掷e
}最后{
什么时候{
APIVersionSatLeast(1,1,0)->this.closeFinally(异常)
this==null->{}
异常==null->close()
其他->
试一试{
关闭()
}捕获(关闭异常:可丢弃){
//cause.addsupprested(closeException)//此处忽略
}
}
}
在大多数
Closable.use
示例中,未使用try-catch,如下所示。 为什么不需要错误处理?安全吗

BufferedReader(FileReader(“test.file”))。使用{return it.readLine()}

我们从Kotlin文档中了解到
使用功能的目的:

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

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

如果引发了异常,并且有办法处理该异常并继续执行代码,请使用try/catch。如果对此没有任何操作,并且控制权应传递给调用方,则无需使用try/catch。

此行

 BufferedReader(FileReader("test.file")).use { return it.readLine() }
不安全。读取和关闭读卡器都会引发IOException,而IOException不是运行时异常(由编程错误引起)。这意味着如果不将其破坏,则会使应用程序受到无法控制的事件的破坏

由于Kotlin没有检查异常,编译器不会就此发出警告。为了安全地执行此操作,您需要将其包装在try/catch中。如果您希望以不同于close错误的方式处理读取错误,则需要使用内部和外部try/catch语句:

try { 
    BufferedReader(FileReader("test.file")).use { 
        try {
            return it.readLine()
        catch (e: IOException) {
            println("Failed to read line")
        }
    }
} catch (e: IOException) {
    println("Failed to close reader")
}
或者包装整个内容并提取任何被抑制的异常,但是区分它们很麻烦:

try {
    BufferedReader(FileReader("test.file")).use { return it.readLine() }
} catch (e: IOException) {
    val throwables = listOf(e, *e.suppressed)
    for (throwable in throwables)
        println(throwable.message)
}

但是在实践中,您可能不会对各种IOException做出不同的反应,因此您可以将一个try/catch放在外部。

这个问答是针对Java的,但在Kotlin中应该应用相同的概念:。@Tenfour04 try/catch不应该包含use函数吗?@Tenfour04我认为是
use
引发了异常eve OP担心。将try/catch放在
use
内部就像做传统的try/catch/finally。将其放在外部会导致在对象关闭后处理异常。如果关闭对象的行为本身会引发异常,那么您需要在
use
外部捕捉异常。这种行为类似于Java的try-with-resources。有趣的是,
use
与Java的
try
在虚拟
try
finally
块的堆叠异常方面的工作方式不同。
use
close
中抑制异常,但
try
使用资源抑制异常请从
中选择,然后重试