我试图避免可变变量,但是问题是我必须访问需要在try中初始化的val(这是migth失败的db操作),并且我需要在finally块中使用该var
我尝试了几种替代方法:
在try块中声明val
try {
val resultSet = SQL(sql).resultSet
return ColumnInfo(resultSet.getMetaData)
} catch {
case e => throw new ColumnInfoException("Error getting metadata")
} finally {
resultSet.close
}
error: not found: value resultSet
在try块外声明val而不初始化它
val resultSet: java.sql.ResultSet
try {
resultSet = SQL(sql).resultSet
return ColumnInfo(resultSet.getMetaData)
} catch {
case e => throw new ColumnInfoException("Error getting metadata")
} finally {
resultSet.close
}
error: only classes can have declared but undefined members
使用一个变种,这似乎工作
var resultSet: java.sql.ResultSet = null
try {
resultSet = SQL(sql).resultSet
return ColumnInfo(resultSet.getMetaData)
} catch {
case e => throw new ColumnInfoException("Error getting metadata")
} finally {
resultSet.close
}
最后嵌套try-catch块,这似乎很脏
try {
val resultSet = SQL(sql).resultSet
try {
return ColumnInfo(resultSet.getMetaData)
} catch {
case e => throw new ColumnInfoException("Error getting metadata")
} finally {
resultSet.close
}
} catch {
case e => throw new ColumnInfoException("Error opening resultSet")
}
有什么更好的方法可以避免使用var和嵌套try-catch块吗?
最佳答案
import scala.util.control.Exception._
allCatch.either(SQL(sql).resultSet).right.flatMap{ resultSet =>
val ans = allCatch.either(ColumnInfo(resultSet.getMetaData))
resultSet.close
ans
}.fold(e => throw e, identity)
或者您可以跳过
fold
并保留打包在Left
中的异常。关于Scala:如何避免尝试catch块内的易变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12362994/