This behavior is explained in "Programming in Scala" by M.Odersky, L. Spoon and B.Venners. I have the first edition and section 7.5 (pg. 128) says:
it’s worth noting that Scala’s behavior differs from Java only because Java’s try-finally
does not result in a value. As in Java, if a finally
clause includes an explicit return statement, or throws an exception, that return value or exception will “overrule” any previous one that originated in the try block or one of its catch clauses. For example,
given:
def f(): Int = try { return 1 } finally { return 2 }
calling f() results in 2. By contrast, given:
def g(): Int = try { 1 } finally { 2 }
calling g() results in 1. Both of these functions exhibit behavior that could surprise most programmers, thus it's usually best to avoid returning values from finally
clauses.
Scala standard library has scala.util.control.Exception
API that provides small functional library for handling exceptions. See the examples in scaladoc