Я недоволен правилом об области видимости переменной в блоке 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 ответ, но как бы исходный код выше быть обернут в вызове метода без введения локального var в тело метода?
Мои собственные усилия были не слишком хорошими, используя параметр by-name для задержки построения, пока безопасно в блоке try не работает, но все же не дает мне доступ к построенному (или нет) объекту в catch или finally block.