我应该在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
使用资源抑制异常请从中选择,然后重试。