'(functional software)


Scala Gotcha: Ignoring Return Value of Using

Scala's Try is well-known utility to handle exceptions in a functional manner. A related util is scala.util.Using which wraps a resource that needs closing (like a file or network connection) and automatically handles it for the user:

Using(openStream("foo.txt")) { stream =>
    stream.foreach(handleStreamElement)
    // stream gets automatically closed here
}

Unfortunately, there is a bug hidden in above code: What happens if handleStreamElement throws an exception?

As Using.apply(...) returns a Try[R], the developer has to check the return value fo see if the operation succeeded or failed. If the return value is unused - as above - errors are silently discarded.

If we don't care about the return value, we should at least add a .get at the end of the code block. On a Failure, .get will Failure.get will throw the failure's exception:

Using(...) { resource =>
  // Use resource
}.get // Unwrap Try[R]; will throw an exception on Failure

Another option is using scala.util.Using.resource(...) which returns a R instead of Try[R] and rethrows exceptions:

Using.resource(...) { r =>
  // Use r
}