WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Scala · Basic · question 20 of 100

How does Scala handle exceptions, and what is the difference between try, catch, and finally blocks?

📕 Buy this interview preparation book: 100 Scala questions & answers — PDF + EPUB for $5

In Scala, exceptions are used to handle unexpected events or errors that may occur during the execution of a program. Exceptions can be caught and managed using the ‘try‘, ‘catch‘, and ‘finally‘ blocks. I’ll explain each of them in detail and provide examples.

1. ‘try‘ block: A ‘try‘ block encloses the code that might throw an exception. If an exception occurs within the ‘try‘ block, the execution is immediately transferred to the appropriate ‘catch‘ block to handle the exception.

try {
  val result = 5 / 0 // This line will throw an ArithmeticException
} catch { ... }

2. ‘catch‘ block: A ‘catch‘ block follows a ‘try‘ block and contains the code for handling different types of exceptions. You can have multiple ‘catch‘ blocks to handle different kinds of exceptions. It is important to note that Scala uses pattern matching for catching exceptions, so the syntax may look different from other programming languages like Java.

try {
  val result = 5 / 0 // This line will throw an ArithmeticException
} catch {
  case e: ArithmeticException => println("Cannot divide by zero: " + e.getMessage)
  case e: Exception => println("Some other exception occurred: " + e.getMessage)
}

3. ‘finally‘ block: A ‘finally‘ block is optional and comes after the ‘try‘ and ‘catch‘ blocks. The code inside the ‘finally‘ block is executed regardless of whether an exception occurred in the ‘try‘ block or not. It is typically used for cleanup tasks, like closing resources or releasing locks.

var inputFile: BufferedReader = null
try {
  inputFile = new BufferedReader(new FileReader("example.txt"))
  // Read and process the file contents here ...
} catch {
  case e: FileNotFoundException => println("File not found: " + e.getMessage)
  case e: IOException => println("IO error: " + e.getMessage)
} finally {
  if (inputFile != null) {
    inputFile.close()
  }
}

It’s worth mentioning that Scala provides another way to deal with exceptions using the ‘Try‘, ‘Success‘, and ‘Failure‘ classes from the ‘scala.util‘ package. This is a more functional approach that doesn’t require using ‘try‘, ‘catch‘, or ‘finally‘ blocks. The ‘Try‘ class can wrap the potentially failing computation, and you can then pattern match on this wrapped value to check if it resulted in ‘Success‘ (no exception) or ‘Failure‘ (exception occurred).

import scala.util.{Try, Success, Failure}

val result = Try(5 / 0)

result match {
  case Success(value) => println("Result: " + value)
  case Failure(exception) => println("Error: " + exception.getMessage)
}

The benefit of this approach is that it makes your code more concise and functional, allowing you to chain operations and avoiding mutable variables.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Scala interview — then scores it.
📞 Practice Scala — free 15 min
📕 Buy this interview preparation book: 100 Scala questions & answers — PDF + EPUB for $5

All 100 Scala questions · All topics