Recently we had a need in a general way to catch calls that can throw an exception.

Recently we had a need in a general way to catch calls that can throw an exception.

Like with any functional or semi-functional language it is fairly easy to create weird looking constructs with Swift.

Let’s create one but first a function that simply throws an error:

func throwAnError() throws -> Void {
    throw DivisionError.ByZero
}

If we call throwAnError() it must be surrounded by a do...catch block.

do {
    try throwAnError()
} catch let error as NSError {
    print("Unable to divide by zero:", error)
} catch {
    print("Failed miserably and have no idea what happened.")
}

And it is all great until we have to call throwAnError() many many times in many different places… For that we can create a function that will do that for us!

func printError(completion: () throws -> Void)
{
    do {
        try completion()
    } catch let error as NSError {
        print("Unable to divide by zero:", error)
    } catch {
        print("Failed miserably and have no idea what happened.")
    }
}

And now we can simply run it as a block:

printError({
    try throwAnError()
})

Welcome to The infinite monkey theorem

Somewhere a monkey just typed Shakespeare in TypeScript. Be the first to read the masterpieces (and the hilarious misfires) landing on the blog.

Subscribe to The infinite monkey theorem

We fling fresh posts—no banana peels attached—straight to your inbox.