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

我试图避免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

在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,这似乎有效

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")
}

是否有一些更好的方法可以避免使用变量和嵌套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)

或者您可以跳过折叠并将例外打包在Left中.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...