微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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中.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐