scala:如何避免try catch块中的mutables

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块?

ope*_*sas 2

来自这个问题的功能性 try & catch w/ Scala

我了解了贷款模式: https: //wiki.scala-lang.org/display/SYGN/Loan

Play框架本身似乎将其与DB.withConnection方法一起使用