Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

try block scope

I'm unhappy with the rule about variable scope in a try block not being shared with associated catch and finally blocks. Specifically it leads to code like the following:

var v: VType = null

try {
  v = new VType()
}
catch {
  case e => // handle VType constructor failure (can reference v)
}
finally {
  // can reference v.
}

As opposed to:

try {
  val v = new VType()
}
catch {
  case e => // handle VType constructor failure (can reference v)
}
finally {
  // can reference v.
}

Can anyone please explain or justify why this rule from Java persists?

and / or is there hope that this could change?

Thanks!

UPDATE

Many thanks for all the responses to date.

The consensus seems to imply "just get on with it" and I'm starting to conclude that perhaps technically what I want is either unsound, not worth the effort or hard to achieve.

I like Rex Kerr's answer but how would the original code above be wrapped in a method call without introducing a local var in the method body?

My own efforts weren't too good, using a by-name parameter to delay construction until safely in the try block works but still doesn't give me access to the constructed (or not) object in the catch or finally blocks.

like image 551
Don Mackenzie Avatar asked Aug 27 '10 20:08

Don Mackenzie


1 Answers

Just "try" this ;)

val v = try { new VType() } catch { case e: Exception => /* ... */ }

In Scala, try is an expression, so it has a value.

like image 79
Siro Mateos Avatar answered Sep 19 '22 16:09

Siro Mateos