我对try块中变量作用域不与相关的catch和finally块共享的规则感到不满意。具体来说,它会导致以下代码:
var v: VType = null
try {
v = new VType()
}
catch {
case e => // handle VType constructor failure (can reference v)
}
finally {
// can reference v.
}
相对于:
try {
val v = new VType()
}
catch {
case e => // handle VType constructor failure (can reference v)
}
finally {
// can reference v.
}
请问有人可以解释或证明为什么这个来自Java的规则一直存在吗?
还有,这个规则是否有望改变?
谢谢!
更新
非常感谢到目前为止所有的回复。
共识似乎是“只管去做”,我开始得出结论,也许从技术上讲,我想要的要么不可靠、不值得付出努力,要么难以实现。
我喜欢Rex Kerr的答案,但如何在方法调用中包装上面的原始代码,而不引入方法体中的局部变量呢?
我的尝试不太好,使用按名称传递的参数推迟构造,直到安全进入try块才进行工作,但仍然无法在catch或finally块中访问已构造(或未构造)的对象。
var
,在需要清除一些资源或其他操作的try-catch-finally
块中,你不能使用val
。 - michael.kebe