scala:如何避免try catch块中的mutables
发布时间:2020-12-16 18:18:21 所属栏目:安全 来源:网络整理
导读:我试图避免mutables变量,但问题是我必须访问我需要在try内部初始化的val(这是一个迁移失败的db操作),我需要在finally块中使用var 我尝试了几种替代方案: 在try块中声明val try { val resultSet = SQL(sql).resultSet return ColumnInfo(resultSet.getMetaDa
我试图避免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中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |