可変変数を避けようとしていますが、問題は、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 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")
}
varsの使用やtry-catchブロックのネストを回避するためのより良いアプローチはありますか?