ope*_*sas 5 scala exception-handling exception immutability
我试图避免mutables变量,但问题是我必须访问我需要在try内部初始化的val(这是一个迁移失败的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
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
使用var,这似乎有效
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
}
Run Code Online (Sandbox Code Playgroud)
最后嵌套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")
}
Run Code Online (Sandbox Code Playgroud)
是否有一些更好的方法可以避免使用变量和嵌套try-catch块?
来自这个问题的功能性 try & catch w/ Scala
我了解了贷款模式: https: //wiki.scala-lang.org/display/SYGN/Loan
Play框架本身似乎将其与DB.withConnection方法一起使用