我试图避免可变变量,但是问题是我必须访问需要在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/

10-12 00:12
查看更多