try/catch/finally

The try/catch/finally construct is used to catch and handle exceptions. The syntax is similar to other languages, like Java, but the syntax is consistent with match expressions.

General syntax:

try
    // some code that can throw 1+ exception types
catch
    // catch and handle the exceptions
    case e1: ExceptionType1 =>
        e1...
    case e2: ExceptionType2 =>
        e2...
finally
    // clean up your resources, i.e., call `.close`

Because it’s an expression, it can be used as the body of a function:

def makeInt(s: String): Int =
    try
        s.toInt
    catch
        case e: NumberFormatException => 0
    finally
        // close your resources
        println("finally!")

An OOP example looks like this:

import java.io.*

val filename = "/etc/passwd"
var stream: Stream[String] = null

try
    stream = Files.lines(Paths.get(filename))
catch
    // catch and handle the exceptions
    case ioe: IOException =>
        ioe.printStackTrace
    case fnf: FileNotFoundException =>
        fnf.printStackTrace
finally
    if stream != null then stream.close